avformat/movenc: Simplify creating chapter track extradata

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt 2022-03-04 14:25:58 +01:00
parent a909666d7c
commit 707ad03096

View File

@ -6238,12 +6238,32 @@ fail:
// as samples, and a tref pointing from the other tracks to the chapter one.
static int mov_create_chapter_track(AVFormatContext *s, int tracknum)
{
AVIOContext *pb;
static const uint8_t stub_header[] = {
// TextSampleEntry
0x00, 0x00, 0x00, 0x01, // displayFlags
0x00, 0x00, // horizontal + vertical justification
0x00, 0x00, 0x00, 0x00, // bgColourRed/Green/Blue/Alpha
// BoxRecord
0x00, 0x00, 0x00, 0x00, // defTextBoxTop/Left
0x00, 0x00, 0x00, 0x00, // defTextBoxBottom/Right
// StyleRecord
0x00, 0x00, 0x00, 0x00, // startChar + endChar
0x00, 0x01, // fontID
0x00, 0x00, // fontStyleFlags + fontSize
0x00, 0x00, 0x00, 0x00, // fgColourRed/Green/Blue/Alpha
// FontTableBox
0x00, 0x00, 0x00, 0x0D, // box size
'f', 't', 'a', 'b', // box atom name
0x00, 0x01, // entry count
// FontRecord
0x00, 0x01, // font ID
0x00, // font name length
};
MOVMuxContext *mov = s->priv_data;
MOVTrack *track = &mov->tracks[tracknum];
AVPacket *pkt = mov->pkt;
int i, len;
int ret;
track->mode = mov->mode;
track->tag = MKTAG('t','e','x','t');
@ -6252,57 +6272,10 @@ static int mov_create_chapter_track(AVFormatContext *s, int tracknum)
if (!track->par)
return AVERROR(ENOMEM);
track->par->codec_type = AVMEDIA_TYPE_SUBTITLE;
#if 0
// These properties are required to make QT recognize the chapter track
uint8_t chapter_properties[43] = { 0, 0, 0, 0, 0, 0, 0, 1, };
if (ff_alloc_extradata(track->par, sizeof(chapter_properties)))
return AVERROR(ENOMEM);
memcpy(track->par->extradata, chapter_properties, sizeof(chapter_properties));
#else
if (avio_open_dyn_buf(&pb) >= 0) {
int size;
uint8_t *buf;
/* Stub header (usually for Quicktime chapter track) */
// TextSampleEntry
avio_wb32(pb, 0x01); // displayFlags
avio_w8(pb, 0x00); // horizontal justification
avio_w8(pb, 0x00); // vertical justification
avio_w8(pb, 0x00); // bgColourRed
avio_w8(pb, 0x00); // bgColourGreen
avio_w8(pb, 0x00); // bgColourBlue
avio_w8(pb, 0x00); // bgColourAlpha
// BoxRecord
avio_wb16(pb, 0x00); // defTextBoxTop
avio_wb16(pb, 0x00); // defTextBoxLeft
avio_wb16(pb, 0x00); // defTextBoxBottom
avio_wb16(pb, 0x00); // defTextBoxRight
// StyleRecord
avio_wb16(pb, 0x00); // startChar
avio_wb16(pb, 0x00); // endChar
avio_wb16(pb, 0x01); // fontID
avio_w8(pb, 0x00); // fontStyleFlags
avio_w8(pb, 0x00); // fontSize
avio_w8(pb, 0x00); // fgColourRed
avio_w8(pb, 0x00); // fgColourGreen
avio_w8(pb, 0x00); // fgColourBlue
avio_w8(pb, 0x00); // fgColourAlpha
// FontTableBox
avio_wb32(pb, 0x0D); // box size
ffio_wfourcc(pb, "ftab"); // box atom name
avio_wb16(pb, 0x01); // entry count
// FontRecord
avio_wb16(pb, 0x01); // font ID
avio_w8(pb, 0x00); // font name length
if ((size = avio_close_dyn_buf(pb, &buf)) > 0) {
track->par->extradata = buf;
track->par->extradata_size = size;
} else {
av_freep(&buf);
}
}
#endif
ret = ff_alloc_extradata(track->par, sizeof(stub_header));
if (ret < 0)
return ret;
memcpy(track->par->extradata, stub_header, sizeof(stub_header));
pkt->stream_index = tracknum;
pkt->flags = AV_PKT_FLAG_KEY;