diff options
author | Thibault Saunier <thibault.saunier@collabora.com> | 2011-10-03 14:25:00 -0300 |
---|---|---|
committer | Thibault Saunier <thibault.saunier@collabora.com> | 2011-10-03 14:45:30 -0300 |
commit | 85a3aa92a09cc9ae9c5f5175cd60a2288cdad29e (patch) | |
tree | d90b8dd2fbbcba0ac5808b451a0663e391a0284a | |
parent | e4e1c63db8d46a6fa2ffb5ff7e01079d07aa926d (diff) |
codecparsers: VC1: compute height and width
Add them to GstVC1SequenceHdr
-rw-r--r-- | gst-libs/gst/codecparsers/gstvc1parser.c | 19 | ||||
-rw-r--r-- | gst-libs/gst/codecparsers/gstvc1parser.h | 2 | ||||
-rw-r--r-- | tests/check/libs/vc1parser.c | 6 |
3 files changed, 19 insertions, 8 deletions
diff --git a/gst-libs/gst/codecparsers/gstvc1parser.c b/gst-libs/gst/codecparsers/gstvc1parser.c index 263d992f8..768adb6fd 100644 --- a/gst-libs/gst/codecparsers/gstvc1parser.c +++ b/gst-libs/gst/codecparsers/gstvc1parser.c @@ -649,6 +649,8 @@ parse_sequence_header_advanced (GstVC1SeqHdr * seqhdr, GstBitReader * br) gst_bit_reader_get_bits_uint16_unchecked (br, 12); advanced->max_coded_width = (advanced->max_coded_width + 1) << 1; advanced->max_coded_height = (advanced->max_coded_height + 1) << 1; + seqhdr->height = (advanced->max_coded_height + 15) >> 4; + seqhdr->width = (advanced->max_coded_height + 15) >> 4; advanced->pulldown = gst_bit_reader_get_bits_uint8_unchecked (br, 1); advanced->interlace = gst_bit_reader_get_bits_uint8_unchecked (br, 1); advanced->tfcntrflag = gst_bit_reader_get_bits_uint8_unchecked (br, 1); @@ -724,8 +726,8 @@ parse_frame_header_advanced (GstBitReader * br, GstVC1FrameHdr * framehdr, GstVC1PicAdvanced *pic = &framehdr->pic.advanced; GstVC1EntryPointHdr *entrypthdr = &advhdr->entrypoint; guint8 mvmodeidx; - guint width = (entrypthdr->coded_width + 15) >> 4; - guint height = (entrypthdr->coded_height + 15) >> 4; + guint width = seqhdr->width; + guint height = seqhdr->height; GST_DEBUG ("Parsing Frame header advanced %u", advhdr->interlace); @@ -982,8 +984,8 @@ parse_frame_header (GstBitReader * br, GstVC1FrameHdr * framehdr, guint8 mvmodeidx; GstVC1PicSimpleMain *pic = &framehdr->pic.simple; GstVC1SimpleMainSeqHdr *simplehdr = &seqhdr->profile.simplemain; - guint width = (simplehdr->coded_width + 15) >> 4; - guint height = (simplehdr->coded_height + 15) >> 4; + guint width = seqhdr->width; + guint height = seqhdr->height; GST_DEBUG ("Parsing frame header in simple or main mode"); @@ -1204,7 +1206,8 @@ gst_vc1_identify_next_bdu (const guint8 * data, gsize size, GstVC1BDU * bdu) ensure_debug_category (); if (size < 4) { - GST_DEBUG ("Can't parse, buffer has too small size %" G_GSSIZE_FORMAT, size); + GST_DEBUG ("Can't parse, buffer has too small size %" G_GSSIZE_FORMAT, + size); return GST_VC1_PARSER_ERROR; } @@ -1339,6 +1342,10 @@ gst_vc1_parse_sequence_header (const guint8 * data, gsize size, simplehdr->slice_code); } + /* compute height and width */ + seqhdr->height = (simplehdr->coded_height + 15) >> 4; + seqhdr->width = (simplehdr->coded_width + 15) >> 4; + return GST_VC1_PARSER_OK; failed: @@ -1399,6 +1406,8 @@ gst_vc1_parse_entry_point_header (const guint8 * data, gsize size, READ_UINT16 (&br, entrypoint->coded_height, 12); entrypoint->coded_height = (entrypoint->coded_height + 1) << 1; entrypoint->coded_width = (entrypoint->coded_width + 1) << 1; + seqhdr->height = (entrypoint->coded_height + 15) >> 4; + seqhdr->width = (entrypoint->coded_width + 15) >> 4; } if (entrypoint->extended_mv) diff --git a/gst-libs/gst/codecparsers/gstvc1parser.h b/gst-libs/gst/codecparsers/gstvc1parser.h index 60344a069..e0b614849 100644 --- a/gst-libs/gst/codecparsers/gstvc1parser.h +++ b/gst-libs/gst/codecparsers/gstvc1parser.h @@ -268,6 +268,8 @@ struct _GstVC1SeqHdr /* calculated */ guint framerate; /* Around in fps, 0 if unknown*/ guint bitrate; /* Around in kpbs, 0 if unknown*/ + guint height; + guint width; union { GstVC1AdvancedSeqHdr advanced; diff --git a/tests/check/libs/vc1parser.c b/tests/check/libs/vc1parser.c index d7e539548..efda05f63 100644 --- a/tests/check/libs/vc1parser.c +++ b/tests/check/libs/vc1parser.c @@ -869,14 +869,14 @@ GST_START_TEST (test_vc1_parse_b_frame_header_main) GstVC1SimpleMainSeqHdr *simplehdr = &seqhdr.profile.simplemain; GstVC1PicSimpleMain *pic = &framehdr.pic.simple; + simplehdr->coded_height = 240; + simplehdr->coded_width = 320; + assert_equals_int (gst_vc1_parse_sequence_header (bframe_header_main, sizeof (bframe_header_main), &seqhdr), GST_VC1_PARSER_OK); assert_equals_int (seqhdr.profiletype, GST_VC1_PROFILE_MAIN); - simplehdr->coded_height = 240; - simplehdr->coded_width = 320; - assert_equals_int (seqhdr.frmrtq_postproc, 7); assert_equals_int (seqhdr.bitrtq_postproc, 3); assert_equals_int (simplehdr->loop_filter, 1); |