libbluray | branch: master | hpi1 <h...@anonymous.org> | Fri Jul 1 18:57:28 2016 +0300| [b4b892f6cc8ab949f88dd7a38e278b4dfbbfcd8d] | committer: hpi1
disc: add support for AVCHD 8.3 filenames > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=b4b892f6cc8ab949f88dd7a38e278b4dfbbfcd8d --- src/libbluray/disc/disc.c | 69 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/src/libbluray/disc/disc.c b/src/libbluray/disc/disc.c index 71585b7..42414d5 100644 --- a/src/libbluray/disc/disc.c +++ b/src/libbluray/disc/disc.c @@ -32,6 +32,7 @@ #include "file/file.h" #include "file/mount.h" +#include <ctype.h> #include <string.h> #ifdef ENABLE_UDF @@ -52,6 +53,8 @@ struct bd_disc { void (*pf_fs_close)(void *); const char *udf_volid; + + int8_t avchd; /* -1 - unknown. 0 - no. 1 - yes */ }; /* @@ -93,6 +96,44 @@ static BD_DIR_H *_bdrom_open_dir(void *p, const char *dir) } /* + * AVCHD 8.3 filenames + */ + +static char *_avchd_file_name(const char *rel_path) +{ + static const char map[][2][6] = { + { ".mpls", ".MPL" }, + { ".clpi", ".CPI" }, + { ".m2ts", ".MTS" }, + { ".bdmv", ".BDM" }, + }; + char *avchd_path = str_dup(rel_path); + char *name = avchd_path ? strrchr(avchd_path, DIR_SEP_CHAR) : NULL; + char *dot = name ? strrchr(name, '.') : NULL; + size_t i; + + if (dot) { + + /* take up to 8 chars from file name */ + for (i = 0; *name && name < dot && i < 9; i++, name++) { + *name = toupper(*name); + } + + /* convert extension */ + for (i = 0; i < sizeof(map) / sizeof(map[0]); i++) { + if (!strcmp(dot, map[i][0])) { + strcpy(name, map[i][1]); + return avchd_path; + } + } + } + + /* failed */ + X_FREE(avchd_path); + return NULL; +} + +/* * overlay filesystem */ @@ -229,6 +270,8 @@ static BD_DISC *_disc_init() p->fs_handle = (void*)p; p->pf_file_open_bdrom = _bdrom_open_path; p->pf_dir_open_bdrom = _bdrom_open_dir; + + p->avchd = -1; } return p; } @@ -341,6 +384,18 @@ BD_FILE_H *disc_open_path(BD_DISC *p, const char *rel_path) { BD_FILE_H *fp; + if (p->avchd > 0) { + char *avchd_path = _avchd_file_name(rel_path); + if (avchd_path) { + BD_DEBUG(DBG_FILE, "AVCHD: %s -> %s\n", rel_path, avchd_path); + fp = p->pf_file_open_bdrom(p->fs_handle, avchd_path); + X_FREE(avchd_path); + if (fp) { + return fp; + } + } + } + /* search file from overlay */ fp = _overlay_open_path(p, rel_path); @@ -349,7 +404,19 @@ BD_FILE_H *disc_open_path(BD_DISC *p, const char *rel_path) fp = p->pf_file_open_bdrom(p->fs_handle, rel_path); if (!fp) { - BD_DEBUG(DBG_FILE | DBG_CRIT, "error opening file %s\n", rel_path); + + /* AVCHD short filenames detection */ + if (p->avchd < 0 && !strcmp(rel_path, "BDMV" DIR_SEP "index.bdmv")) { + fp = p->pf_file_open_bdrom(p->fs_handle, "BDMV" DIR_SEP "INDEX.BDM"); + if (fp) { + BD_DEBUG(DBG_FILE | DBG_CRIT, "detected AVCHD 8.3 filenames\n"); + } + p->avchd = !!fp; + } + + if (!fp) { + BD_DEBUG(DBG_FILE | DBG_CRIT, "error opening file %s\n", rel_path); + } } } _______________________________________________ libbluray-devel mailing list libbluray-devel@videolan.org https://mailman.videolan.org/listinfo/libbluray-devel