summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Saunier <thibault.saunier@collabora.com>2011-10-03 14:25:00 -0300
committerThibault Saunier <thibault.saunier@collabora.com>2011-10-03 14:45:30 -0300
commit85a3aa92a09cc9ae9c5f5175cd60a2288cdad29e (patch)
treed90b8dd2fbbcba0ac5808b451a0663e391a0284a
parente4e1c63db8d46a6fa2ffb5ff7e01079d07aa926d (diff)
codecparsers: VC1: compute height and width
Add them to GstVC1SequenceHdr
-rw-r--r--gst-libs/gst/codecparsers/gstvc1parser.c19
-rw-r--r--gst-libs/gst/codecparsers/gstvc1parser.h2
-rw-r--r--tests/check/libs/vc1parser.c6
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);