mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Merge commit '90ed6c5cf7f236bc9efb47c97b40358c666d1386'
* commit '90ed6c5cf7f236bc9efb47c97b40358c666d1386': h2645_parse: compute the actual data length, without trailing paddding Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
This commit is contained in:
commit
79aafd43fd
@ -22,14 +22,13 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "libavutil/intmath.h"
|
||||||
#include "libavutil/intreadwrite.h"
|
#include "libavutil/intreadwrite.h"
|
||||||
#include "libavutil/mem.h"
|
#include "libavutil/mem.h"
|
||||||
|
|
||||||
#include "hevc.h"
|
#include "hevc.h"
|
||||||
#include "h2645_parse.h"
|
#include "h2645_parse.h"
|
||||||
|
|
||||||
/* FIXME: This is adapted from ff_h264_decode_nal, avoiding duplication
|
|
||||||
* between these functions would be nice. */
|
|
||||||
int ff_h2645_extract_rbsp(const uint8_t *src, int length,
|
int ff_h2645_extract_rbsp(const uint8_t *src, int length,
|
||||||
H2645NAL *nal)
|
H2645NAL *nal)
|
||||||
{
|
{
|
||||||
@ -178,6 +177,31 @@ static const char *nal_unit_name(int nal_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_bit_length(H2645NAL *nal, int skip_trailing_zeros)
|
||||||
|
{
|
||||||
|
int size = nal->size;
|
||||||
|
int v;
|
||||||
|
|
||||||
|
while (skip_trailing_zeros && size > 0 && nal->data[size - 1] == 0)
|
||||||
|
size--;
|
||||||
|
|
||||||
|
if (!size)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
v = nal->data[size - 1];
|
||||||
|
|
||||||
|
if (size > INT_MAX / 8)
|
||||||
|
return AVERROR(ERANGE);
|
||||||
|
size *= 8;
|
||||||
|
|
||||||
|
/* remove the stop bit and following trailing zeros,
|
||||||
|
* or nothing for damaged bitstreams */
|
||||||
|
if (v)
|
||||||
|
size -= ff_ctz(v) + 1;
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
|
* @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
|
||||||
* 0 if the unit should be skipped, 1 otherwise
|
* 0 if the unit should be skipped, 1 otherwise
|
||||||
@ -231,6 +255,7 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
|
|||||||
while (length >= 4) {
|
while (length >= 4) {
|
||||||
H2645NAL *nal;
|
H2645NAL *nal;
|
||||||
int extract_length = 0;
|
int extract_length = 0;
|
||||||
|
int skip_trailing_zeros = 1;
|
||||||
|
|
||||||
if (is_nalff) {
|
if (is_nalff) {
|
||||||
int i;
|
int i;
|
||||||
@ -292,7 +317,15 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
|
|||||||
|
|
||||||
pkt->nb_nals++;
|
pkt->nb_nals++;
|
||||||
|
|
||||||
ret = init_get_bits8(&nal->gb, nal->data, nal->size);
|
/* see commit 3566042a0 */
|
||||||
|
if (consumed < length - 3 &&
|
||||||
|
buf[consumed] == 0x00 && buf[consumed + 1] == 0x00 &&
|
||||||
|
buf[consumed + 2] == 0x01 && buf[consumed + 3] == 0xE0)
|
||||||
|
skip_trailing_zeros = 0;
|
||||||
|
|
||||||
|
nal->size_bits = get_bit_length(nal, skip_trailing_zeros);
|
||||||
|
|
||||||
|
ret = init_get_bits8(&nal->gb, nal->data, nal->size_bits);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -33,6 +33,12 @@ typedef struct H2645NAL {
|
|||||||
int size;
|
int size;
|
||||||
const uint8_t *data;
|
const uint8_t *data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Size, in bits, of just the data, excluding the stop bit and any trailing
|
||||||
|
* padding. I.e. what HEVC calls SODB.
|
||||||
|
*/
|
||||||
|
int size_bits;
|
||||||
|
|
||||||
int raw_size;
|
int raw_size;
|
||||||
const uint8_t *raw_data;
|
const uint8_t *raw_data;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user