mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
codecparsers: h264: add nal_reader_skip_long() helper.
Add nal_reader_skip_long() helper function to allow an arbitrary number of bits to be skipped. The former nal_reader_skip() function is too limited to the actual cache size. Use this new function to simplify gst_h264_parser_parse_sei_message() default case, that skips unsupported payloads. v2: made args consistent from header to source file. Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
This commit is contained in:
parent
2e83aca728
commit
0440cabf49
3 changed files with 26 additions and 8 deletions
|
@ -893,18 +893,13 @@ gst_h264_parser_parse_sei_message (GstH264NalParser * nalparser,
|
||||||
res = gst_h264_parser_parse_pic_timing (nalparser,
|
res = gst_h264_parser_parse_pic_timing (nalparser,
|
||||||
&sei->payload.pic_timing, nr);
|
&sei->payload.pic_timing, nr);
|
||||||
break;
|
break;
|
||||||
default:{
|
default:
|
||||||
/* Just consume payloadSize bytes, which does not account for
|
/* Just consume payloadSize bytes, which does not account for
|
||||||
emulation prevention bytes */
|
emulation prevention bytes */
|
||||||
guint nbits = payload_size % 8;
|
if (!nal_reader_skip_long (nr, payload_size))
|
||||||
while (payload_size > 0) {
|
goto error;
|
||||||
nal_reader_skip (nr, nbits);
|
|
||||||
payload_size -= nbits;
|
|
||||||
nbits = 8;
|
|
||||||
}
|
|
||||||
res = GST_H264_PARSER_OK;
|
res = GST_H264_PARSER_OK;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* When SEI message doesn't end at byte boundary,
|
/* When SEI message doesn't end at byte boundary,
|
||||||
|
|
|
@ -113,9 +113,13 @@ nal_reader_read (NalReader * nr, guint nbits)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Skips the specified amount of bits. This is only suitable to a
|
||||||
|
cacheable number of bits */
|
||||||
inline gboolean
|
inline gboolean
|
||||||
nal_reader_skip (NalReader * nr, guint nbits)
|
nal_reader_skip (NalReader * nr, guint nbits)
|
||||||
{
|
{
|
||||||
|
g_assert (nbits <= 8 * sizeof (nr->cache));
|
||||||
|
|
||||||
if (G_UNLIKELY (!nal_reader_read (nr, nbits)))
|
if (G_UNLIKELY (!nal_reader_read (nr, nbits)))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -124,6 +128,24 @@ nal_reader_skip (NalReader * nr, guint nbits)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Generic version to skip any number of bits */
|
||||||
|
gboolean
|
||||||
|
nal_reader_skip_long (NalReader * nr, guint nbits)
|
||||||
|
{
|
||||||
|
/* Leave out enough bits in the cache once we are finished */
|
||||||
|
const guint skip_size = 4 * sizeof (nr->cache);
|
||||||
|
guint remaining = nbits;
|
||||||
|
|
||||||
|
nbits %= skip_size;
|
||||||
|
while (remaining > 0) {
|
||||||
|
if (!nal_reader_skip (nr, nbits))
|
||||||
|
return FALSE;
|
||||||
|
remaining -= nbits;
|
||||||
|
nbits = skip_size;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
inline guint
|
inline guint
|
||||||
nal_reader_get_pos (const NalReader * nr)
|
nal_reader_get_pos (const NalReader * nr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -57,6 +57,7 @@ void nal_reader_init (NalReader * nr, const guint8 * data, guint size);
|
||||||
|
|
||||||
gboolean nal_reader_read (NalReader * nr, guint nbits);
|
gboolean nal_reader_read (NalReader * nr, guint nbits);
|
||||||
gboolean nal_reader_skip (NalReader * nr, guint nbits);
|
gboolean nal_reader_skip (NalReader * nr, guint nbits);
|
||||||
|
gboolean nal_reader_skip_long (NalReader * nr, guint nbits);
|
||||||
guint nal_reader_get_pos (const NalReader * nr);
|
guint nal_reader_get_pos (const NalReader * nr);
|
||||||
guint nal_reader_get_remaining (const NalReader * nr);
|
guint nal_reader_get_remaining (const NalReader * nr);
|
||||||
guint nal_reader_get_epb_count (const NalReader * nr);
|
guint nal_reader_get_epb_count (const NalReader * nr);
|
||||||
|
|
Loading…
Reference in a new issue