diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-03-02 11:45:41 +0100 |
---|---|---|
committer | Tim-Philipp Müller <tim.muller@collabora.co.uk> | 2012-03-03 15:53:46 +0000 |
commit | 5c9f7900759d3ea2ae740e4dd04079381678fed8 (patch) | |
tree | 42b23cf2d429ef3b10cff42fcf2a83c93ddc55bb /gst-libs | |
parent | 0bb5a01639079e30f7236b932ad11d4a48cda47c (diff) | |
download | gstreamer-plugins-bad-5c9f7900759d3ea2ae740e4dd04079381678fed8.tar.gz |
codecparsers: h264: record number of emulation prevention bytes in slice_header().
Some hardware video decode acceleration API (VA-API, DXVA) require
a bit count to the first macroblock, minus the number of emulation
prevention bytes. So, instead of having the consumer of the library
scan the slice_header() again, just record that number while parsing.
Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
https://bugzilla.gnome.org/show_bug.cgi?id=671203
Diffstat (limited to 'gst-libs')
-rw-r--r-- | gst-libs/gst/codecparsers/gsth264parser.c | 10 | ||||
-rw-r--r-- | gst-libs/gst/codecparsers/gsth264parser.h | 3 |
2 files changed, 13 insertions, 0 deletions
diff --git a/gst-libs/gst/codecparsers/gsth264parser.c b/gst-libs/gst/codecparsers/gsth264parser.c index 572a28ded..efb4c739d 100644 --- a/gst-libs/gst/codecparsers/gsth264parser.c +++ b/gst-libs/gst/codecparsers/gsth264parser.c @@ -167,6 +167,7 @@ typedef struct const guint8 *data; guint size; + guint n_epb; /* Number of emulation prevention bytes */ guint byte; /* Byte position */ guint bits_in_cache; /* bitpos in the cache of next bit */ guint8 first_byte; @@ -178,6 +179,7 @@ nal_reader_init (NalReader * nr, const guint8 * data, guint size) { nr->data = data; nr->size = size; + nr->n_epb = 0; nr->byte = 0; nr->bits_in_cache = 0; @@ -211,6 +213,7 @@ nal_reader_read (NalReader * nr, guint nbits) ((nr->cache & 0xff) == 0)) { /* next byte goes unconditionally to the cache, even if it's 0x03 */ check_three_byte = FALSE; + nr->n_epb++; goto next_byte; } nr->cache = (nr->cache << 8) | nr->first_byte; @@ -263,6 +266,12 @@ nal_reader_get_remaining (const NalReader * nr) return (nr->size - nr->byte) * 8 + nr->bits_in_cache; } +static inline guint +nal_reader_get_epb_count (const NalReader * nr) +{ + return nr->n_epb; +} + #define GST_NAL_READER_READ_BITS(bits) \ static gboolean \ nal_reader_get_bits_uint##bits (NalReader *nr, guint##bits *val, guint nbits) \ @@ -1882,6 +1891,7 @@ gst_h264_parser_parse_slice_hdr (GstH264NalParser * nalparser, } slice->header_size = nal_reader_get_pos (&nr); + slice->n_emulation_prevention_bytes = nal_reader_get_epb_count (&nr); return GST_H264_PARSER_OK; diff --git a/gst-libs/gst/codecparsers/gsth264parser.h b/gst-libs/gst/codecparsers/gsth264parser.h index 3c221560e..2e570c8a9 100644 --- a/gst-libs/gst/codecparsers/gsth264parser.h +++ b/gst-libs/gst/codecparsers/gsth264parser.h @@ -599,6 +599,9 @@ struct _GstH264SliceHdr /* Size of the slice_header() in bits */ guint header_size; + + /* Number of emulation prevention bytes (EPB) in this slice_header() */ + guint n_emulation_prevention_bytes; }; |