libbluray | branch: master | hpi1 <[email protected]> | Fri May 6 14:44:27 2011 +0300| [bbcc1b90307f10e4807b15fb8a72a866820ccf3b] | committer: hpi1
Added decoding of presentation composition segments > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=bbcc1b90307f10e4807b15fb8a72a866820ccf3b --- src/libbluray/decoders/graphics_processor.c | 30 ++++++++++++++-------- src/libbluray/decoders/graphics_processor.h | 2 +- src/libbluray/decoders/pg.h | 13 +++++++++ src/libbluray/decoders/pg_decode.c | 37 +++++++++++++++++++++++++++ src/libbluray/decoders/pg_decode.h | 3 ++ 5 files changed, 73 insertions(+), 12 deletions(-) diff --git a/src/libbluray/decoders/graphics_processor.c b/src/libbluray/decoders/graphics_processor.c index 12eeffe..358555f 100644 --- a/src/libbluray/decoders/graphics_processor.c +++ b/src/libbluray/decoders/graphics_processor.c @@ -234,8 +234,8 @@ static int _decode_pds(PG_DISPLAY_SET *s, BITBUFFER *bb, PES_BUFFER *p) for (ii = 0; ii < s->num_palette; ii++) { if (s->palette[ii].id == id) { int rr; - if ( (s->ics && s->ics->composition_descriptor.state == 0)/* || - (s->pcs && s->pcs->composition_descriptor.state == 2)*/) { + if ( (s->ics && s->ics->composition_descriptor.state == 0) || + (s->pcs && s->pcs->composition_descriptor.state == 0)) { /* 8.8.3.1.1 */ rr = pg_decode_palette_update(bb, &s->palette[ii]); } else { @@ -266,7 +266,8 @@ static int _decode_pds(PG_DISPLAY_SET *s, BITBUFFER *bb, PES_BUFFER *p) static void _check_epoch_start(PG_DISPLAY_SET *s) { - if (s->ics->composition_descriptor.state == 2) { + if ((s->pcs && s->pcs->composition_descriptor.state == 2) || + (s->ics && s->ics->composition_descriptor.state == 2)) { /* epoch start, drop all cached data */ unsigned ii; @@ -287,12 +288,20 @@ static void _check_epoch_start(PG_DISPLAY_SET *s) static int _decode_pcs(PG_DISPLAY_SET *s, BITBUFFER *bb, PES_BUFFER *p) { - (void)s; - (void)bb; - (void)p; + pg_free_composition(&s->pcs); + s->pcs = calloc(1, sizeof(*s->pcs)); - BD_DEBUG(DBG_DECODE | DBG_CRIT, "unhandled segment type (PGS_PG_COMPOSITION)\n"); - return 0; + if (!pg_decode_composition(bb, s->pcs)) { + pg_free_composition(&s->pcs); + return 0; + } + + s->pcs->pts = p->pts; + s->valid_pts = p->pts; + + _check_epoch_start(s); + + return 1; } static int _decode_ics(PG_DISPLAY_SET *s, BITBUFFER *bb, PES_BUFFER *p) @@ -305,9 +314,8 @@ static int _decode_ics(PG_DISPLAY_SET *s, BITBUFFER *bb, PES_BUFFER *p) return 0; } - s->ics->pts = p->pts; - - s->valid_pts = s->ics->pts; + s->ics->pts = p->pts; + s->valid_pts = p->pts; _check_epoch_start(s); diff --git a/src/libbluray/decoders/graphics_processor.h b/src/libbluray/decoders/graphics_processor.h index 37f6287..19b8cf3 100644 --- a/src/libbluray/decoders/graphics_processor.h +++ b/src/libbluray/decoders/graphics_processor.h @@ -48,7 +48,7 @@ typedef struct { /* only one of the following segments can be present */ BD_IG_INTERACTIVE *ics; - /*BD_PG_PRESENTATON_COMPOSITION_SEGMENT *pcs;*/ + BD_PG_COMPOSITION *pcs; } PG_DISPLAY_SET; diff --git a/src/libbluray/decoders/pg.h b/src/libbluray/decoders/pg.h index c6b54b3..1567a17 100644 --- a/src/libbluray/decoders/pg.h +++ b/src/libbluray/decoders/pg.h @@ -85,5 +85,18 @@ typedef struct { } BD_PG_OBJECT; +typedef struct { + int64_t pts; + + BD_PG_VIDEO_DESCRIPTOR video_descriptor; + BD_PG_COMPOSITION_DESCRIPTOR composition_descriptor; + + uint8_t palette_update_flag; + uint8_t palette_id_ref; + + unsigned num_composition_objects; + BD_PG_COMPOSITION_OBJECT *composition_object; + +} BD_PG_COMPOSITION; #endif // _BD_PG_H_ diff --git a/src/libbluray/decoders/pg_decode.c b/src/libbluray/decoders/pg_decode.c index 3fac4b2..6708bac 100644 --- a/src/libbluray/decoders/pg_decode.c +++ b/src/libbluray/decoders/pg_decode.c @@ -196,6 +196,28 @@ int pg_decode_object(BITBUFFER *bb, BD_PG_OBJECT *p) return _decode_rle(bb, p); } +int pg_decode_composition(BITBUFFER *bb, BD_PG_COMPOSITION *p) +{ + unsigned ii; + + pg_decode_video_descriptor(bb, &p->video_descriptor); + pg_decode_composition_descriptor(bb, &p->composition_descriptor); + + p->palette_update_flag = bb_read(bb, 1); + bb_skip(bb, 7); + + p->palette_id_ref = bb_read(bb, 8); + + p->num_composition_objects = bb_read(bb, 8); + p->composition_object = calloc(p->num_composition_objects, sizeof(BD_PG_COMPOSITION_OBJECT)); + + for (ii = 0; ii < p->num_composition_objects; ii++) { + pg_decode_composition_object(bb, &p->composition_object[ii]); + } + + return 1; +} + /* * cleanup */ @@ -207,6 +229,13 @@ void pg_clean_object(BD_PG_OBJECT *p) } } +void pg_clean_composition(BD_PG_COMPOSITION *p) +{ + if (p) { + X_FREE(p->composition_object); + } +} + void pg_free_window(BD_PG_WINDOW **p) { if (p && *p) { @@ -228,3 +257,11 @@ void pg_free_object(BD_PG_OBJECT **p) X_FREE(*p); } } + +void pg_free_composition(BD_PG_COMPOSITION **p) +{ + if (p && *p) { + pg_clean_composition(*p); + X_FREE(*p); + } +} diff --git a/src/libbluray/decoders/pg_decode.h b/src/libbluray/decoders/pg_decode.h index 169efe7..d8af2b5 100644 --- a/src/libbluray/decoders/pg_decode.h +++ b/src/libbluray/decoders/pg_decode.h @@ -42,15 +42,18 @@ BD_PRIVATE void pg_decode_composition_object(BITBUFFER *bb, BD_PG_COMPOSITION_OB BD_PRIVATE int pg_decode_palette_update(BITBUFFER *bb, BD_PG_PALETTE *p); BD_PRIVATE int pg_decode_palette(BITBUFFER *bb, BD_PG_PALETTE *p); BD_PRIVATE int pg_decode_object(BITBUFFER *bb, BD_PG_OBJECT *p); +BD_PRIVATE int pg_decode_composition(BITBUFFER *bb, BD_PG_COMPOSITION *p); /* * cleanup */ BD_PRIVATE void pg_clean_object(BD_PG_OBJECT *p); +BD_PRIVATE void pg_clean_composition(BD_PG_COMPOSITION *p); BD_PRIVATE void pg_free_window(BD_PG_WINDOW **p); BD_PRIVATE void pg_free_palette(BD_PG_PALETTE **p); BD_PRIVATE void pg_free_object(BD_PG_OBJECT **p); +BD_PRIVATE void pg_free_composition(BD_PG_COMPOSITION **p); #endif // _PG_DECODE_H_ _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
