libbluray | branch: master | hpi1 <[email protected]> | Mon Apr 14 10:48:12 2014 +0300| [c94349fc32ac49695a2cda1d6103594eade2e4b2] | committer: hpi1
improve error resilence and logging > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=c94349fc32ac49695a2cda1d6103594eade2e4b2 --- src/libbluray/bdnav/clpi_parse.c | 10 ++++--- src/libbluray/bdnav/index_parse.c | 54 +++++++++++++++++++++++++++++-------- src/libbluray/bdnav/mpls_parse.c | 11 +++++--- src/libbluray/hdmv/hdmv_vm.c | 6 ++--- src/libbluray/hdmv/mobj_parse.c | 8 ++++-- 5 files changed, 67 insertions(+), 22 deletions(-) diff --git a/src/libbluray/bdnav/clpi_parse.c b/src/libbluray/bdnav/clpi_parse.c index b8e956d..d87628c 100644 --- a/src/libbluray/bdnav/clpi_parse.c +++ b/src/libbluray/bdnav/clpi_parse.c @@ -18,11 +18,14 @@ * <http://www.gnu.org/licenses/>. */ -#include "util/macro.h" +#include "clpi_parse.h" + +#include "extdata_parse.h" + #include "file/file.h" #include "util/bits.h" -#include "extdata_parse.h" -#include "clpi_parse.h" +#include "util/macro.h" +#include "util/logging.h" #include <stdlib.h> #include <string.h> @@ -598,6 +601,7 @@ static int _parse_clpi_extension(BITSTREAM *bits, int id1, int id2, void *handle } } + BD_DEBUG(DBG_NAV | DBG_CRIT, "_parse_clpi_extension(): unhandled extension %d.%d\n", id1, id2); return 0; } diff --git a/src/libbluray/bdnav/index_parse.c b/src/libbluray/bdnav/index_parse.c index f07c261..d76a9c9 100644 --- a/src/libbluray/bdnav/index_parse.c +++ b/src/libbluray/bdnav/index_parse.c @@ -17,12 +17,13 @@ * <http://www.gnu.org/licenses/>. */ +#include "index_parse.h" + #include "file/file.h" #include "util/bits.h" #include "util/logging.h" #include "util/macro.h" #include "util/strutl.h" -#include "index_parse.h" #include <stdlib.h> #include <string.h> @@ -35,6 +36,12 @@ static int _parse_hdmv_obj(BITSTREAM *bs, INDX_HDMV_OBJ *hdmv) hdmv->id_ref = bs_read(bs, 16); bs_skip(bs, 32); + if (hdmv->playback_type != indx_hdmv_playback_type_movie && + hdmv->playback_type != indx_hdmv_playback_type_interactive) { + + BD_DEBUG(DBG_NAV | DBG_CRIT, "index.bdmv: invalid HDMV playback type %d\n", hdmv->playback_type); + } + return 1; } @@ -46,6 +53,12 @@ static int _parse_bdj_obj(BITSTREAM *bs, INDX_BDJ_OBJ *bdj) bdj->name[5] = 0; bs_skip(bs, 8); + if (bdj->playback_type != indx_bdj_playback_type_movie && + bdj->playback_type != indx_bdj_playback_type_interactive) { + + BD_DEBUG(DBG_NAV | DBG_CRIT, "index.bdmv: invalid BD-J playback type %d\n", bdj->playback_type); + } + return 1; } @@ -54,11 +67,16 @@ static int _parse_playback_obj(BITSTREAM *bs, INDX_PLAY_ITEM *obj) obj->object_type = bs_read(bs, 2); bs_skip(bs, 30); - if (obj->object_type == 1) { - return _parse_hdmv_obj(bs, &obj->hdmv); - } else { - return _parse_bdj_obj(bs, &obj->bdj); + switch (obj->object_type) { + case indx_object_type_hdmv: + return _parse_hdmv_obj(bs, &obj->hdmv); + + case indx_object_type_bdj: + return _parse_bdj_obj(bs, &obj->bdj); } + + BD_DEBUG(DBG_NAV | DBG_CRIT, "index.bdmv: unknown object type %d\n", obj->object_type); + return 0; } static int _parse_index(BITSTREAM *bs, INDX_ROOT *index) @@ -89,10 +107,20 @@ static int _parse_index(BITSTREAM *bs, INDX_ROOT *index) index->titles[i].access_type = bs_read(bs, 2); bs_skip(bs, 28); - if (index->titles[i].object_type == 1) { - _parse_hdmv_obj(bs, &index->titles[i].hdmv); - } else { - _parse_bdj_obj(bs, &index->titles[i].bdj); + switch (index->titles[i].object_type) { + case indx_object_type_hdmv: + if (!_parse_hdmv_obj(bs, &index->titles[i].hdmv)) + return 0; + break; + + case indx_object_type_bdj: + if (!_parse_bdj_obj(bs, &index->titles[i].bdj)) + return 0; + break; + + default: + BD_DEBUG(DBG_NAV | DBG_CRIT, "index.bdmv: unknown object type %d (#%d)\n", index->titles[i].object_type, i); + return 0; } } @@ -140,8 +168,8 @@ static int _parse_header(BITSTREAM *bs, int *index_start, int *extension_data_st if (sig1 != INDX_SIG1 || (sig2 != INDX_SIG2A && sig2 != INDX_SIG2B)) { - BD_DEBUG(DBG_NAV | DBG_CRIT, "index.bdmv failed signature match: expected INDX0100 got %8.8s\n", bs->buf); - return 0; + BD_DEBUG(DBG_NAV | DBG_CRIT, "index.bdmv failed signature match: expected INDX0100 got %8.8s\n", bs->buf); + return 0; } *index_start = bs_read(bs, 32); @@ -172,6 +200,10 @@ static INDX_ROOT *_indx_parse(const char *file_name) goto error; } + if (extension_data_start) { + BD_DEBUG(DBG_NAV | DBG_CRIT, "index.bdmv: unknown extension data at %d\n", extension_data_start); + } + if (!_parse_app_info(&bs, &index->app_info)) { BD_DEBUG(DBG_NAV | DBG_CRIT, "index.bdmv: error parsing app info\n"); goto error; diff --git a/src/libbluray/bdnav/mpls_parse.c b/src/libbluray/bdnav/mpls_parse.c index dd8ce9f..7db2e08 100644 --- a/src/libbluray/bdnav/mpls_parse.c +++ b/src/libbluray/bdnav/mpls_parse.c @@ -18,11 +18,14 @@ * <http://www.gnu.org/licenses/>. */ -#include "util/macro.h" +#include "mpls_parse.h" + +#include "extdata_parse.h" + #include "file/file.h" #include "util/bits.h" -#include "extdata_parse.h" -#include "mpls_parse.h" +#include "util/logging.h" +#include "util/macro.h" #include <stdlib.h> #include <string.h> @@ -897,6 +900,8 @@ _parse_mpls_extension(BITSTREAM *bits, int id1, int id2, void *handle) } } + BD_DEBUG(DBG_NAV | DBG_CRIT, "_parse_mpls_extension(): unhandled extension %d.%d\n", id1, id2); + return 0; } diff --git a/src/libbluray/hdmv/hdmv_vm.c b/src/libbluray/hdmv/hdmv_vm.c index 60e5a77..ee11870 100644 --- a/src/libbluray/hdmv/hdmv_vm.c +++ b/src/libbluray/hdmv/hdmv_vm.c @@ -516,14 +516,14 @@ static int _call_title(HDMV_VM *p, uint32_t title) static int _play_at(HDMV_VM *p, int playlist, int playitem, int playmark) { if (p->ig_object && playlist >= 0) { - BD_DEBUG(DBG_HDMV, "play_at(list %d, item %d, mark %d): " + BD_DEBUG(DBG_HDMV | DBG_CRIT, "play_at(list %d, item %d, mark %d): " "playlist change not allowed in interactive composition\n", playlist, playitem, playmark); return -1; } if (!p->ig_object && playlist < 0) { - BD_DEBUG(DBG_HDMV, "play_at(list %d, item %d, mark %d): " + BD_DEBUG(DBG_HDMV | DBG_CRIT, "play_at(list %d, item %d, mark %d): " "playlist not given in movie object (link commands not allowed)\n", playlist, playitem, playmark); return -1; @@ -551,7 +551,7 @@ static int _play_at(HDMV_VM *p, int playlist, int playitem, int playmark) static int _play_stop(HDMV_VM *p) { if (!p->ig_object) { - BD_DEBUG(DBG_HDMV, "_play_stop() not allowed in movie object\n"); + BD_DEBUG(DBG_HDMV | DBG_CRIT, "_play_stop() not allowed in movie object\n"); return -1; } diff --git a/src/libbluray/hdmv/mobj_parse.c b/src/libbluray/hdmv/mobj_parse.c index dafaf6c..ae30398 100644 --- a/src/libbluray/hdmv/mobj_parse.c +++ b/src/libbluray/hdmv/mobj_parse.c @@ -17,14 +17,14 @@ * <http://www.gnu.org/licenses/>. */ +#include "mobj_parse.h" + #include "file/file.h" #include "util/bits.h" #include "util/logging.h" #include "util/macro.h" #include "util/strutl.h" -#include "mobj_parse.h" - #include <stdlib.h> #include <string.h> @@ -142,6 +142,10 @@ static MOBJ_OBJECTS *_mobj_parse(const char *file_name) goto error; } + if (extension_data_start) { + BD_DEBUG(DBG_NAV | DBG_CRIT, "MovieObject.bdmv: unknown extension data at %d\n", extension_data_start); + } + bs_seek_byte(&bs, 40); data_len = bs_read(&bs, 32); _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
