1
0
Fork 0

avcodec/h264_mp4toannexb_bsf: refactor start_code_size handling

start_code_size depends on whether PS comes from out-of-band or
in-band. Make the code more readable.

Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
This commit is contained in:
Zhao Zhili 2023-05-19 00:46:39 +08:00
parent fb52070848
commit 91cbae2f6c
1 changed files with 27 additions and 7 deletions

View File

@ -43,10 +43,26 @@ typedef struct H264BSFContext {
int extradata_parsed;
} H264BSFContext;
enum PsSource {
PS_OUT_OF_BAND = -1,
PS_NONE = 0,
PS_IN_BAND = 1,
};
static void count_or_copy(uint8_t **out, uint64_t *out_size,
const uint8_t *in, int in_size, int ps, int copy)
const uint8_t *in, int in_size, enum PsSource ps, int copy)
{
uint8_t start_code_size = ps < 0 ? 0 : *out_size == 0 || ps ? 4 : 3;
uint8_t start_code_size;
if (ps == PS_OUT_OF_BAND)
/* start code already present in out-of-band ps data, so don't need to
* add it manually again
*/
start_code_size = 0;
else if (ps == PS_IN_BAND || *out_size == 0)
start_code_size = 4;
else
start_code_size = 3;
if (copy) {
memcpy(*out + start_code_size, in, in_size);
@ -202,6 +218,7 @@ static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *opkt)
do {
uint32_t nal_size = 0;
enum PsSource ps;
/* possible overread ok due to padding */
for (int i = 0; i < s->length_size; i++)
@ -230,7 +247,7 @@ static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *opkt)
if (!s->sps_size) {
LOG_ONCE(ctx, AV_LOG_WARNING, "SPS not present in the stream, nor in AVCC, stream may be unreadable\n");
} else {
count_or_copy(&out, &out_size, s->sps, s->sps_size, -1, j);
count_or_copy(&out, &out_size, s->sps, s->sps_size, PS_OUT_OF_BAND, j);
sps_seen = 1;
}
}
@ -246,19 +263,22 @@ static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *opkt)
if (new_idr && unit_type == H264_NAL_IDR_SLICE && !sps_seen && !pps_seen) {
if (ctx->par_out->extradata)
count_or_copy(&out, &out_size, ctx->par_out->extradata,
ctx->par_out->extradata_size, -1, j);
ctx->par_out->extradata_size, PS_OUT_OF_BAND, j);
new_idr = 0;
/* if only SPS has been seen, also insert PPS */
} else if (new_idr && unit_type == H264_NAL_IDR_SLICE && sps_seen && !pps_seen) {
if (!s->pps_size) {
LOG_ONCE(ctx, AV_LOG_WARNING, "PPS not present in the stream, nor in AVCC, stream may be unreadable\n");
} else {
count_or_copy(&out, &out_size, s->pps, s->pps_size, -1, j);
count_or_copy(&out, &out_size, s->pps, s->pps_size, PS_OUT_OF_BAND, j);
}
}
count_or_copy(&out, &out_size, buf, nal_size,
unit_type == H264_NAL_SPS || unit_type == H264_NAL_PPS, j);
if (unit_type == H264_NAL_SPS || unit_type == H264_NAL_PPS)
ps = PS_IN_BAND;
else
ps = PS_NONE;
count_or_copy(&out, &out_size, buf, nal_size, ps, j);
if (!new_idr && unit_type == H264_NAL_SLICE) {
new_idr = 1;
sps_seen = 0;