avformat/mpegtsenc: refact mpegts_check_bitstream to loop up table

Signed-off-by: Marton Balint <cus@passwd.hu>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Nuo Mi 2024-01-30 20:48:59 +08:00
parent aa3155e4c2
commit 8559cce3c3

View File

@ -2257,23 +2257,26 @@ static void mpegts_deinit(AVFormatContext *s)
static int mpegts_check_bitstream(AVFormatContext *s, AVStream *st,
const AVPacket *pkt)
{
int ret = 1;
const struct Entry {
enum AVCodecID id;
const char *bsf_name;
uint8_t mask;
uint8_t value;
} list[] = {
{ AV_CODEC_ID_H264, "h264_mp4toannexb", 0xff, 0x01 /* configurationVersion in AVCDecoderConfigurationRecord */},
{ AV_CODEC_ID_HEVC, "hevc_mp4toannexb", 0xff, 0x01 /* configurationVersion in HEVCDecoderConfigurationRecord */},
};
if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
(AV_RB24(pkt->data) != 0x000001 ||
(st->codecpar->extradata_size > 0 &&
st->codecpar->extradata[0] == 1)))
ret = ff_stream_add_bitstream_filter(st, "h264_mp4toannexb", NULL);
} else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC) {
if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
(AV_RB24(pkt->data) != 0x000001 ||
(st->codecpar->extradata_size > 0 &&
st->codecpar->extradata[0] == 1)))
ret = ff_stream_add_bitstream_filter(st, "hevc_mp4toannexb", NULL);
for (int i = 0; i < FF_ARRAY_ELEMS(list); i++) {
const struct Entry *e = list + i;
if (e->id == st->codecpar->codec_id &&
pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
(AV_RB24(pkt->data) != 0x000001 ||
(st->codecpar->extradata_size > 0 &&
(st->codecpar->extradata[0] & e->mask == e->value))))
return ff_stream_add_bitstream_filter(st, e->bsf_name, NULL);
}
return ret;
return 1;
}
#define OFFSET(x) offsetof(MpegTSWrite, x)