libbluray | branch: master | hpi1 <[email protected]> | Fri Aug 31 22:26:36 2012 +0300| [0e5763df58b75a824cab95be15f6a8ff96763bfa] | committer: hpi1
Parse extent start points (.ssif interleaving) from clip info file extension data > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=0e5763df58b75a824cab95be15f6a8ff96763bfa --- src/examples/Makefile.am | 2 ++ src/examples/clpi_dump.c | 37 ++++++++++++++++++++++++++++++-- src/libbluray/bdnav/clpi_data.h | 11 ++++++++++ src/libbluray/bdnav/clpi_parse.c | 43 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 2 deletions(-) diff --git a/src/examples/Makefile.am b/src/examples/Makefile.am index 9fea45b..8c570c2 100644 --- a/src/examples/Makefile.am +++ b/src/examples/Makefile.am @@ -31,6 +31,7 @@ mpls_dump_SOURCES = \ ../util/logging.c \ ../file/file_posix.c \ ../file/dir_posix.c \ + ../libbluray/bdnav/extdata_parse.c \ ../libbluray/bdnav/mpls_parse.c \ ../libbluray/bdnav/clpi_parse.c \ ../libbluray/bdnav/navigation.c @@ -39,6 +40,7 @@ clpi_dump_SOURCES = \ clpi_dump.c util.c util.h \ ../util/logging.c \ ../file/file_posix.c \ + ../libbluray/bdnav/extdata_parse.c \ ../libbluray/bdnav/clpi_parse.c sound_dump_SOURCES = \ diff --git a/src/examples/clpi_dump.c b/src/examples/clpi_dump.c index 35ed4fe..f949aab 100644 --- a/src/examples/clpi_dump.c +++ b/src/examples/clpi_dump.c @@ -259,6 +259,27 @@ _show_prog_info(CLPI_PROG_INFO *pi, int level) } static void +_show_extent_start(CLPI_EXTENT_START *es, int level) +{ + unsigned int ii; + + indent_printf(level, "Extension data: Extent Start Point"); + + if (!es->num_point) { + indent_printf(level+1, "(no data)"); + + } else { + indent_printf(level+1, "Number of Start Points: %d", es->num_point); + + if (verbose) { + for (ii = 0; ii < es->num_point; ii++) { + indent_printf(level+1, "Extent %5d: SPN 0x%08X", ii, es->point[ii]); + } + } + } +} + +static void _show_cpi_info(CLPI_CPI *cpi, int level) { CLPI_EP_MAP_ENTRY *entry; @@ -336,12 +357,13 @@ _usage(char *cmd) " s - Shows the Sequence Info structure\n" " p - Shows the Program Info structure\n" " i - Shows the CPI. PTS to SPN map\n" +" e - Shows Extent Start Table\n" , cmd); exit(EXIT_FAILURE); } -#define OPTS "vcspi" +#define OPTS "vcspie" int main(int argc, char *argv[]) @@ -349,7 +371,7 @@ main(int argc, char *argv[]) CLPI_CL *cl; int opt; int opt_clip_info = 0, opt_seq_info = 0, opt_prog_info = 0; - int opt_cpi_info = 0; + int opt_cpi_info = 0, opt_extent_start = 0; int ii; do { @@ -377,6 +399,10 @@ main(int argc, char *argv[]) opt_prog_info = 1; break; + case 'e': + opt_extent_start = 1; + break; + default: _usage(argv[0]); break; @@ -409,6 +435,13 @@ main(int argc, char *argv[]) // Show cpi _show_cpi_info(&cl->cpi, 1); } + if (opt_extent_start) { + // Show extent start point + if (cl->extent_start.num_point > 0) { + _show_extent_start(&cl->extent_start, 1); + } + } + clpi_free(cl); } return 0; diff --git a/src/libbluray/bdnav/clpi_data.h b/src/libbluray/bdnav/clpi_data.h index 1cf8b95..6d36018 100644 --- a/src/libbluray/bdnav/clpi_data.h +++ b/src/libbluray/bdnav/clpi_data.h @@ -130,6 +130,12 @@ typedef struct CLPI_EP_MAP_ENTRY *entry; } CLPI_CPI; +/* Extent start points (profile 5 / version 2.4) */ +typedef struct { + uint32_t num_point; + uint32_t *point; +} CLPI_EXTENT_START; + typedef struct clpi_cl { uint32_t type_indicator; uint32_t type_indicator2; @@ -143,6 +149,11 @@ typedef struct clpi_cl { CLPI_PROG_INFO program; CLPI_CPI cpi; // skip clip mark & extension data + + // extensions for 3D + + CLPI_EXTENT_START extent_start; /* extent start points (.ssif interleaving) */ + } CLPI_CL; #endif // _CLPI_DATA_H_ diff --git a/src/libbluray/bdnav/clpi_parse.c b/src/libbluray/bdnav/clpi_parse.c index 43d9e2e..16a81e7 100644 --- a/src/libbluray/bdnav/clpi_parse.c +++ b/src/libbluray/bdnav/clpi_parse.c @@ -20,6 +20,7 @@ #include "util/macro.h" #include "file/file.h" #include "util/bits.h" +#include "extdata_parse.h" #include "clpi_parse.h" #include <stdlib.h> @@ -532,6 +533,37 @@ clpi_access_point(const CLPI_CL *cl, uint32_t pkt, int next, int angle_change, u return coarse_spn + entry->fine[jj].spn_ep; } +static int +_parse_extent_start_points(BITSTREAM *bits, CLPI_EXTENT_START *es) +{ + unsigned int ii; + + bs_skip(bits, 32); // length + es->num_point = bs_read(bits, 32); + + es->point = malloc(es->num_point * sizeof(uint32_t)); + + for (ii = 0; ii < es->num_point; ii++) { + es->point[ii] = bs_read(bits, 32); + } + + return 1; +} + +static int _parse_clpi_extension(BITSTREAM *bits, int id1, int id2, void *handle) +{ + CLPI_CL *cl = handle; + + if (id1 == 2) { + if (id2 == 4) { + // Extent start point + return _parse_extent_start_points(bits, &cl->extent_start); + } + } + + return 0; +} + void clpi_free(CLPI_CL *cl) { @@ -572,6 +604,9 @@ clpi_free(CLPI_CL *cl) if (cl->cpi.entry != NULL) { X_FREE(cl->cpi.entry); } + + X_FREE(cl->extent_start.point); + X_FREE(cl); } @@ -602,6 +637,14 @@ _clpi_parse(const char *path, int verbose) clpi_free(cl); return NULL; } + + if (cl->ext_data_start_addr > 0) { + bdmv_parse_extension_data(&bits, + cl->ext_data_start_addr, + _parse_clpi_extension, + cl); + } + if (!_parse_clipinfo(&bits, cl)) { file_close(fp); clpi_free(cl); _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
