|
|
|
@ -410,19 +410,30 @@ static int hevc_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size) |
|
|
|
|
{ |
|
|
|
|
const uint8_t *ptr = buf, *end = buf + buf_size; |
|
|
|
|
uint32_t state = -1; |
|
|
|
|
int has_ps = 0, nut; |
|
|
|
|
int has_vps = 0; |
|
|
|
|
int has_sps = 0; |
|
|
|
|
int has_pps = 0; |
|
|
|
|
int nut; |
|
|
|
|
|
|
|
|
|
while (ptr < end) { |
|
|
|
|
ptr = avpriv_find_start_code(ptr, end, &state); |
|
|
|
|
if ((state >> 8) != START_CODE) |
|
|
|
|
break; |
|
|
|
|
nut = (state >> 1) & 0x3F; |
|
|
|
|
if (nut >= NAL_VPS && nut <= NAL_PPS) |
|
|
|
|
has_ps = 1; |
|
|
|
|
else if (has_ps) |
|
|
|
|
return ptr - 4 - buf; |
|
|
|
|
else // no parameter set at the beginning of the stream
|
|
|
|
|
return 0; |
|
|
|
|
if (nut == NAL_VPS) |
|
|
|
|
has_vps = 1; |
|
|
|
|
else if (nut == NAL_SPS) |
|
|
|
|
has_sps = 1; |
|
|
|
|
else if (nut == NAL_PPS) |
|
|
|
|
has_pps = 1; |
|
|
|
|
else if ((nut != NAL_SEI_PREFIX || has_pps) && |
|
|
|
|
nut != NAL_AUD) { |
|
|
|
|
if (has_vps && has_sps) { |
|
|
|
|
while (ptr - 4 > buf && ptr[-5] == 0) |
|
|
|
|
ptr--; |
|
|
|
|
return ptr - 4 - buf; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|