Petri Hintukainen pushed to branch master at VideoLAN / libbluray
Commits: 2dfe914f by hpi1 at 2020-08-03T17:03:40+03:00 bdnav: regonize fmts files - - - - - 64cf2cb8 by hpi1 at 2020-08-03T17:04:26+03:00 refcnt: add (optional) cleanup routine - - - - - 9ecdddea by hpi1 at 2020-08-03T17:05:06+03:00 BD-J: get title infos in init() - - - - - 280e8fc7 by hpi1 at 2020-08-03T17:05:33+03:00 Simplify - - - - - 1ec56c76 by hpi1 at 2020-08-03T17:05:51+03:00 Add const - - - - - 10 changed files: - src/libbluray/bdj/java/org/videolan/Libbluray.java - src/libbluray/bdnav/mpls_parse.c - src/libbluray/bdnav/navigation.c - src/libbluray/bdnav/navigation.h - src/libbluray/bluray.c - src/libbluray/decoders/pg_decode.c - src/libbluray/decoders/rle.c - src/libbluray/decoders/rle.h - src/util/refcnt.c - src/util/refcnt.h Changes: ===================================== src/libbluray/bdj/java/org/videolan/Libbluray.java ===================================== @@ -353,6 +353,13 @@ public class Libbluray { loadAdapter(System.getProperty("org.videolan.loader.adapter")); loadAdapter(pkg); + /* get title infos */ + titleInfos = getTitleInfosN(nativePointer); + if (titleInfos == null) { + /* this is fatal */ + throw new Error("getTitleInfos() failed"); + } + booted = true; } @@ -388,9 +395,7 @@ public class Libbluray { System.err.println("shutdown() failed: " + e + "\n" + Logger.dumpStack(e)); } nativePointer = 0; - synchronized (titleInfosLock) { - titleInfos = null; - } + titleInfos = null; synchronized (bdjoFilesLock) { bdjoFiles = null; } @@ -430,20 +435,11 @@ public class Libbluray { /* used by javax/tv/service/SIManagerImpl */ public static int numTitles() { - synchronized (titleInfosLock) { - if (titleInfos == null) { - titleInfos = getTitleInfosN(nativePointer); - if (titleInfos == null) { - return -1; - } - } - return titleInfos.length - 2; - } + return titleInfos.length - 2; } /* used by org/bluray/ti/TitleImpl */ public static TitleInfo getTitleInfo(int titleNum) { - synchronized (titleInfosLock) { int numTitles = numTitles(); if (numTitles < 0) return null; @@ -456,7 +452,6 @@ public class Libbluray { throw new IllegalArgumentException(); return titleInfos[titleNum]; - } } /* used by org/bluray/ti/PlayListImpl */ @@ -831,6 +826,5 @@ public class Libbluray { int x0, int y0, int x1, int y1); private static long nativePointer = 0; - private static Object titleInfosLock = new Object(); private static TitleInfo[] titleInfos = null; } ===================================== src/libbluray/bdnav/mpls_parse.c ===================================== @@ -463,7 +463,7 @@ _parse_playitem(BITSTREAM *bits, MPLS_PI *pi) bs_read_string(bits, clip_id, 5); bs_read_string(bits, codec_id, 4); - if (memcmp(codec_id, "M2TS", 4) != 0) { + if (memcmp(codec_id, "M2TS", 4) != 0 && memcmp(codec_id, "FMTS", 4) != 0) { BD_DEBUG(DBG_NAV | DBG_CRIT, "Incorrect CodecIdentifier (%s)\n", codec_id); } @@ -516,7 +516,7 @@ _parse_playitem(BITSTREAM *bits, MPLS_PI *pi) bs_read_string(bits, pi->clip[ii].clip_id, 5); bs_read_string(bits, pi->clip[ii].codec_id, 4); - if (memcmp(pi->clip[ii].codec_id, "M2TS", 4) != 0) { + if (memcmp(pi->clip[ii].codec_id, "M2TS", 4) != 0 && memcmp(pi->clip[ii].codec_id, "FMTS", 4) != 0) { BD_DEBUG(DBG_NAV | DBG_CRIT, "Incorrect CodecIdentifier (%s)\n", pi->clip[ii].codec_id); } pi->clip[ii].stc_id = bs_read(bits, 8); @@ -570,7 +570,7 @@ _parse_subplayitem(BITSTREAM *bits, MPLS_SUB_PI *spi) bs_read_string(bits, clip_id, 5); bs_read_string(bits, codec_id, 4); - if (memcmp(codec_id, "M2TS", 4) != 0) { + if (memcmp(codec_id, "M2TS", 4) != 0 && memcmp(codec_id, "FMTS", 4) != 0) { BD_DEBUG(DBG_NAV | DBG_CRIT, "Incorrect CodecIdentifier (%s)\n", codec_id); } @@ -610,7 +610,7 @@ _parse_subplayitem(BITSTREAM *bits, MPLS_SUB_PI *spi) bs_read_string(bits, spi->clip[ii].clip_id, 5); bs_read_string(bits, spi->clip[ii].codec_id, 4); - if (memcmp(spi->clip[ii].codec_id, "M2TS", 4) != 0) { + if (memcmp(spi->clip[ii].codec_id, "M2TS", 4) != 0 && memcmp(spi->clip[ii].codec_id, "FMTS", 4) != 0) { BD_DEBUG(DBG_NAV | DBG_CRIT, "Incorrect CodecIdentifier (%s)\n", spi->clip[ii].codec_id); } spi->clip[ii].stc_id = bs_read(bits, 8); ===================================== src/libbluray/bdnav/navigation.c ===================================== @@ -511,7 +511,7 @@ void nav_free_title_list(NAV_TITLE_LIST **title_list) * */ -uint8_t nav_clip_lookup_aspect(NAV_CLIP *clip, int pid) +uint8_t nav_clip_lookup_aspect(const NAV_CLIP *clip, int pid) { CLPI_PROG *progs; int ii, jj; @@ -642,7 +642,10 @@ static void _fill_clip(NAV_TITLE *title, } memcpy(clip->name, mpls_clip[clip->angle].clip_id, 5); - memcpy(&clip->name[5], ".m2ts", 6); + if (!memcmp(mpls_clip[clip->angle].codec_id, "FMTS", 4)) + memcpy(&clip->name[5], ".fmts", 6); + else + memcpy(&clip->name[5], ".m2ts", 6); clip->clip_id = atoi(mpls_clip[clip->angle].clip_id); clpi_free(&clip->cl); @@ -881,7 +884,7 @@ NAV_CLIP* nav_mark_search(NAV_TITLE *title, unsigned mark, uint32_t *clip_pkt, u return clip; } -void nav_clip_packet_search(NAV_CLIP *clip, uint32_t pkt, uint32_t *clip_pkt, uint32_t *clip_time) +void nav_clip_packet_search(const NAV_CLIP *clip, uint32_t pkt, uint32_t *clip_pkt, uint32_t *clip_time) { *clip_time = clip->in_time; if (clip->cl != NULL) { @@ -955,7 +958,7 @@ NAV_CLIP* nav_packet_search(NAV_TITLE *title, uint32_t pkt, uint32_t *clip_pkt, // Search to the timestamp obtained from nav_angle_change_search using // nav_clip_time_search. Otherwise start at the start_pkt defined // by the clip. -uint32_t nav_clip_angle_change_search(NAV_CLIP *clip, uint32_t pkt, uint32_t *time) +uint32_t nav_clip_angle_change_search(const NAV_CLIP *clip, uint32_t pkt, uint32_t *time) { if (clip->cl == NULL) { return pkt; @@ -1002,7 +1005,7 @@ NAV_CLIP* nav_time_search(NAV_TITLE *title, uint32_t tick, uint32_t *clip_pkt, u // Search for random access point closest to the requested time // Time is in 45khz ticks, between clip in_time and out_time. -void nav_clip_time_search(NAV_CLIP *clip, uint32_t tick, uint32_t *clip_pkt, uint32_t *out_pkt) +void nav_clip_time_search(const NAV_CLIP *clip, uint32_t tick, uint32_t *clip_pkt, uint32_t *out_pkt) { if (tick >= clip->out_time) { *clip_pkt = clip->end_pkt; @@ -1031,7 +1034,7 @@ void nav_clip_time_search(NAV_CLIP *clip, uint32_t tick, uint32_t *clip_pkt, uin * Pointer to NAV_CLIP struct * NULL - End of clip list */ -NAV_CLIP* nav_next_clip(NAV_TITLE *title, NAV_CLIP *clip) +NAV_CLIP* nav_next_clip(NAV_TITLE *title, const NAV_CLIP *clip) { if (clip == NULL) { return &title->clip_list.clip[0]; @@ -1042,22 +1045,22 @@ NAV_CLIP* nav_next_clip(NAV_TITLE *title, NAV_CLIP *clip) return &title->clip_list.clip[clip->ref + 1]; } -NAV_CLIP* nav_set_angle(NAV_TITLE *title, NAV_CLIP *clip, unsigned angle) +void nav_set_angle(NAV_TITLE *title, unsigned angle) { int ii; uint32_t pos = 0; uint32_t time = 0; if (title == NULL) { - return clip; + return; } if (angle > 8) { // invalid angle - return clip; + return; } if (angle == title->angle) { // no change - return clip; + return; } title->angle = angle; @@ -1074,10 +1077,9 @@ NAV_CLIP* nav_set_angle(NAV_TITLE *title, NAV_CLIP *clip, unsigned angle) pi->still_mode, pi->still_time, cl, ii, &pos, &time); } _extrapolate_title(title); - return clip; } -char *nav_clip_textst_font(NAV_CLIP *clip, int index) +char *nav_clip_textst_font(const NAV_CLIP *clip, int index) { char *file; ===================================== src/libbluray/bdnav/navigation.h ===================================== @@ -151,9 +151,9 @@ BD_PRIVATE void nav_free_title_list(NAV_TITLE_LIST **title_list); BD_PRIVATE NAV_TITLE* nav_title_open(struct bd_disc *disc, const char *playlist, unsigned angle) BD_ATTR_MALLOC; BD_PRIVATE void nav_title_close(NAV_TITLE **title); -BD_PRIVATE NAV_CLIP* nav_next_clip(NAV_TITLE *title, NAV_CLIP *clip); +BD_PRIVATE NAV_CLIP* nav_next_clip(NAV_TITLE *title, const NAV_CLIP *clip); BD_PRIVATE uint32_t nav_chapter_get_current(NAV_TITLE *title, uint32_t title_pkt); -BD_PRIVATE NAV_CLIP* nav_set_angle(NAV_TITLE *title, NAV_CLIP *clip, unsigned angle); +BD_PRIVATE void nav_set_angle(NAV_TITLE *title, unsigned angle); BD_PRIVATE NAV_CLIP* nav_packet_search(NAV_TITLE *title, uint32_t pkt, uint32_t *clip_pkt, uint32_t *out_pkt, uint32_t *out_time); @@ -163,11 +163,11 @@ BD_PRIVATE NAV_CLIP* nav_mark_search(NAV_TITLE *title, unsigned mark, uint32_t * /* clip ops */ -BD_PRIVATE uint32_t nav_clip_angle_change_search(NAV_CLIP *clip, uint32_t pkt, uint32_t *time); -BD_PRIVATE void nav_clip_time_search(NAV_CLIP *clip, uint32_t tick, uint32_t *clip_pkt, uint32_t *out_pkt); -BD_PRIVATE void nav_clip_packet_search(NAV_CLIP *clip, uint32_t pkt, uint32_t *clip_pkt, uint32_t *clip_time); +BD_PRIVATE uint32_t nav_clip_angle_change_search(const NAV_CLIP *clip, uint32_t pkt, uint32_t *time); +BD_PRIVATE void nav_clip_time_search(const NAV_CLIP *clip, uint32_t tick, uint32_t *clip_pkt, uint32_t *out_pkt); +BD_PRIVATE void nav_clip_packet_search(const NAV_CLIP *clip, uint32_t pkt, uint32_t *clip_pkt, uint32_t *clip_time); -BD_PRIVATE char *nav_clip_textst_font(NAV_CLIP *clip, int index); -BD_PRIVATE uint8_t nav_clip_lookup_aspect(NAV_CLIP *clip, int pid); +BD_PRIVATE char *nav_clip_textst_font(const NAV_CLIP *clip, int index); +BD_PRIVATE uint8_t nav_clip_lookup_aspect(const NAV_CLIP *clip, int pid); #endif // _NAVIGATION_H_ ===================================== src/libbluray/bluray.c ===================================== @@ -67,7 +67,7 @@ typedef enum { typedef struct { /* current clip */ - NAV_CLIP *clip; + const NAV_CLIP *clip; BD_FILE_H *fp; uint64_t clip_size; uint64_t clip_block_pos; @@ -92,7 +92,7 @@ typedef struct { } BD_STREAM; typedef struct { - NAV_CLIP *clip; + const NAV_CLIP *clip; size_t clip_size; uint8_t *buf; } BD_PRELOAD; @@ -241,7 +241,7 @@ static void _update_time_psr(BLURAY *bd, uint32_t time) static uint32_t _update_time_psr_from_stream(BLURAY *bd) { /* update PSR_TIME from stream. Not real presentation time (except when seeking), but near enough. */ - NAV_CLIP *clip = bd->st0.clip; + const NAV_CLIP *clip = bd->st0.clip; if (bd->title && clip) { @@ -311,7 +311,7 @@ static void _update_stream_psr_by_lang(BD_REGISTERS *regs, 0x80000fff); } -static void _update_clip_psrs(BLURAY *bd, NAV_CLIP *clip) +static void _update_clip_psrs(BLURAY *bd, const NAV_CLIP *clip) { MPLS_STN *stn = &clip->title->pl->play_item[clip->ref].stn; uint32_t audio_lang = 0; @@ -358,7 +358,7 @@ static void _update_clip_psrs(BLURAY *bd, NAV_CLIP *clip) static void _update_playlist_psrs(BLURAY *bd) { - NAV_CLIP *clip = bd->st0.clip; + const NAV_CLIP *clip = bd->st0.clip; bd_psr_write(bd->regs, PSR_PLAYLIST, atoi(bd->title->name)); bd_psr_write(bd->regs, PSR_ANGLE_NUMBER, bd->title->angle + 1); @@ -497,7 +497,7 @@ static void _update_textst_timer(BLURAY *bd) /* next event in this clip ? */ if (cmds.wakeup_time >= bd->st0.clip->in_time && cmds.wakeup_time < bd->st0.clip->out_time) { /* find event position in main path clip */ - NAV_CLIP *clip = bd->st0.clip; + const NAV_CLIP *clip = bd->st0.clip; if (clip->cl) { uint32_t spn; nav_clip_time_search(clip, cmds.wakeup_time, &spn, NULL); @@ -821,7 +821,7 @@ static int _preload_m2ts(BLURAY *bd, BD_PRELOAD *p) } static int64_t _seek_stream(BLURAY *bd, BD_STREAM *st, - NAV_CLIP *clip, uint32_t clip_pkt) + const NAV_CLIP *clip, uint32_t clip_pkt) { if (!clip) return -1; @@ -1612,7 +1612,7 @@ static void _playmark_reached(BLURAY *bd) */ static void _seek_internal(BLURAY *bd, - NAV_CLIP *clip, uint32_t title_pkt, uint32_t clip_pkt) + const NAV_CLIP *clip, uint32_t title_pkt, uint32_t clip_pkt) { if (_seek_stream(bd, &bd->st0, clip, clip_pkt) >= 0) { uint32_t media_time; @@ -1648,7 +1648,7 @@ static void _seek_internal(BLURAY *bd, static void _change_angle(BLURAY *bd) { if (bd->seamless_angle_change) { - bd->st0.clip = nav_set_angle(bd->title, bd->st0.clip, bd->request_angle); + nav_set_angle(bd->title, bd->request_angle); bd->seamless_angle_change = 0; bd_psr_write(bd->regs, PSR_ANGLE_NUMBER, bd->title->angle + 1); @@ -1660,7 +1660,7 @@ static void _change_angle(BLURAY *bd) int64_t bd_seek_time(BLURAY *bd, uint64_t tick) { uint32_t clip_pkt, out_pkt; - NAV_CLIP *clip; + const NAV_CLIP *clip; if (tick >> 33) { BD_DEBUG(DBG_BLURAY | DBG_CRIT, "bd_seek_time(%" PRIu64 ") failed: invalid timestamp\n", tick); @@ -1693,7 +1693,7 @@ int64_t bd_seek_time(BLURAY *bd, uint64_t tick) uint64_t bd_tell_time(BLURAY *bd) { uint32_t clip_pkt = 0, out_pkt = 0, out_time = 0; - NAV_CLIP *clip; + const NAV_CLIP *clip; if (!bd) { return 0; @@ -1716,7 +1716,7 @@ uint64_t bd_tell_time(BLURAY *bd) int64_t bd_seek_chapter(BLURAY *bd, unsigned chapter) { uint32_t clip_pkt, out_pkt; - NAV_CLIP *clip; + const NAV_CLIP *clip; bd_mutex_lock(&bd->mutex); @@ -1777,7 +1777,7 @@ uint32_t bd_get_current_chapter(BLURAY *bd) int64_t bd_seek_playitem(BLURAY *bd, unsigned clip_ref) { uint32_t clip_pkt, out_pkt; - NAV_CLIP *clip; + const NAV_CLIP *clip; bd_mutex_lock(&bd->mutex); @@ -1804,7 +1804,7 @@ int64_t bd_seek_playitem(BLURAY *bd, unsigned clip_ref) int64_t bd_seek_mark(BLURAY *bd, unsigned mark) { uint32_t clip_pkt, out_pkt; - NAV_CLIP *clip; + const NAV_CLIP *clip; bd_mutex_lock(&bd->mutex); @@ -1830,7 +1830,7 @@ int64_t bd_seek_mark(BLURAY *bd, unsigned mark) int64_t bd_seek(BLURAY *bd, uint64_t pos) { uint32_t pkt, clip_pkt, out_pkt, out_time; - NAV_CLIP *clip; + const NAV_CLIP *clip; bd_mutex_lock(&bd->mutex); @@ -2520,7 +2520,7 @@ static int _bd_select_angle(BLURAY *bd, unsigned angle) orig_angle = bd->title->angle; - bd->st0.clip = nav_set_angle(bd->title, bd->st0.clip, angle); + nav_set_angle(bd->title, angle); if (orig_angle == bd->title->angle) { return 1; @@ -2614,7 +2614,7 @@ int bd_get_main_title(BLURAY *bd) return bd->title_list->main_title_idx; } -static int _copy_streams(NAV_CLIP *clip, BLURAY_STREAM_INFO **pstreams, MPLS_STREAM *si, int count) +static int _copy_streams(const NAV_CLIP *clip, BLURAY_STREAM_INFO **pstreams, MPLS_STREAM *si, int count) { BLURAY_STREAM_INFO *streams; int ii; @@ -2695,7 +2695,7 @@ static BLURAY_TITLE_INFO* _fill_title_info(NAV_TITLE* title, uint32_t title_idx, for (ii = 0; ii < title_info->clip_count; ii++) { MPLS_PI *pi = &title->pl->play_item[ii]; BLURAY_CLIP_INFO *ci = &title_info->clips[ii]; - NAV_CLIP *nc = &title->clip_list.clip[ii]; + const NAV_CLIP *nc = &title->clip_list.clip[ii]; memcpy(ci->clip_id, pi->clip->clip_id, sizeof(ci->clip_id)); ci->pkt_count = nc->end_pkt - nc->start_pkt; @@ -3012,7 +3012,7 @@ static void _process_psr_restore_event(BLURAY *bd, BD_PSR_EVENT *ev) return; case PSR_PLAYLIST: bd_select_playlist(bd, ev->new_val); - nav_set_angle(bd->title, bd->st0.clip, bd_psr_read(bd->regs, PSR_ANGLE_NUMBER) - 1); + nav_set_angle(bd->title, bd_psr_read(bd->regs, PSR_ANGLE_NUMBER) - 1); return; case PSR_PLAYITEM: bd_seek_playitem(bd, ev->new_val); @@ -3863,7 +3863,7 @@ int bd_get_meta_file(BLURAY *bd, const char *name, void **data, int64_t *size) struct clpi_cl *bd_get_clpi(BLURAY *bd, unsigned clip_ref) { if (bd->title && clip_ref < bd->title->clip_list.count) { - NAV_CLIP *clip = &bd->title->clip_list.clip[clip_ref]; + const NAV_CLIP *clip = &bd->title->clip_list.clip[clip_ref]; return clpi_copy(clip->cl); } return NULL; ===================================== src/libbluray/decoders/pg_decode.c ===================================== @@ -129,7 +129,7 @@ static int _decode_rle(BITBUFFER *bb, BD_PG_OBJECT *p) if (rle_size < 1) rle_size = 1; - tmp = refcnt_realloc(p->img, rle_size * sizeof(BD_PG_RLE_ELEM)); + tmp = refcnt_realloc(p->img, rle_size * sizeof(BD_PG_RLE_ELEM), NULL); if (!tmp) { BD_DEBUG(DBG_DECODE | DBG_CRIT, "pg_decode_object(): realloc failed\n"); return 0; @@ -170,7 +170,7 @@ static int _decode_rle(BITBUFFER *bb, BD_PG_OBJECT *p) num_rle++; if (num_rle >= rle_size) { rle_size *= 2; - tmp = refcnt_realloc(p->img, rle_size * sizeof(BD_PG_RLE_ELEM)); + tmp = refcnt_realloc(p->img, rle_size * sizeof(BD_PG_RLE_ELEM), NULL); if (!tmp) { BD_DEBUG(DBG_DECODE | DBG_CRIT, "pg_decode_object(): realloc failed\n"); return 0; ===================================== src/libbluray/decoders/rle.c ===================================== @@ -37,7 +37,7 @@ static int _rle_ensure_size(RLE_ENC *p) return -1; } /* realloc to 2x */ - void *tmp = refcnt_realloc(start, p->num_elem * 2 * sizeof(BD_PG_RLE_ELEM)); + void *tmp = refcnt_realloc(start, p->num_elem * 2 * sizeof(BD_PG_RLE_ELEM), NULL); if (!tmp) { p->error = 1; return -1; ===================================== src/libbluray/decoders/rle.h ===================================== @@ -52,7 +52,7 @@ static inline int rle_begin(RLE_ENC *p) { p->num_elem = 1024; p->free_elem = 1024; - p->elem = refcnt_realloc(NULL, p->num_elem * sizeof(BD_PG_RLE_ELEM)); + p->elem = refcnt_realloc(NULL, p->num_elem * sizeof(BD_PG_RLE_ELEM), NULL); if (!p->elem) { return -1; } ===================================== src/util/refcnt.c ===================================== @@ -34,6 +34,7 @@ */ typedef struct { + void (*cleanup)(void *); BD_MUTEX mutex; /* initialized only if counted == 1 */ int count; /* reference count */ unsigned counted; /* 1 if this object is ref-counted */ @@ -85,10 +86,13 @@ void bd_refcnt_dec(const void *obj) bd_mutex_destroy(&ref->mutex); } + if (ref->cleanup) + ref->cleanup(&ref[1]); + free(ref); } -void *refcnt_realloc(void *obj, size_t sz) +void *refcnt_realloc(void *obj, size_t sz, void (*cleanup)(void *)) { sz += sizeof(BD_REFCNT); @@ -103,6 +107,7 @@ void *refcnt_realloc(void *obj, size_t sz) if (obj) { obj = realloc(&((BD_REFCNT *)obj)[-1], sz); if (!obj) { + /* do not call cleanup() - nothing is free'd here */ return NULL; } } else { @@ -113,6 +118,7 @@ void *refcnt_realloc(void *obj, size_t sz) memset(obj, 0, sizeof(BD_REFCNT)); } + ((BD_REFCNT *)obj)->cleanup = cleanup; return &((BD_REFCNT *)obj)[1]; } ===================================== src/util/refcnt.h ===================================== @@ -50,7 +50,7 @@ extern "C" { * */ -BD_PRIVATE void *refcnt_realloc(void *obj, size_t sz); +BD_PRIVATE void *refcnt_realloc(void *obj, size_t sz, void (*cleanup)(void *)); #ifndef BD_OVERLAY_INTERFACE_VERSION void bd_refcnt_inc(const void *obj); View it on GitLab: https://code.videolan.org/videolan/libbluray/-/compare/5d567c805b98002c88088d3958668eb78298f56d...1ec56c7653e6ede56be94c126730f662580ef726 -- View it on GitLab: https://code.videolan.org/videolan/libbluray/-/compare/5d567c805b98002c88088d3958668eb78298f56d...1ec56c7653e6ede56be94c126730f662580ef726 You're receiving this email because of your account on code.videolan.org.
_______________________________________________ libbluray-devel mailing list libbluray-devel@videolan.org https://mailman.videolan.org/listinfo/libbluray-devel