【修改说明】解决字幕轨seek问题

Signed-off-by: Atrotro <wanganzhouhh@163.com>
This commit is contained in:
Atrotro 2024-07-26 16:02:05 +08:00
parent 7df0eac0c1
commit f80c2d3873
4 changed files with 26 additions and 0 deletions

View File

@ -144,6 +144,7 @@ config("ffmpeg_config") {
"-DOHOS_SDTP_BOX_EXT",
"-DOHOS_NONSTANDARD_BOM",
"-DOHOS_TIMED_META_TRACK",
"-DOHOS_SUBTITLE_DEMUXER",
]
if (use_musl) {
cflags += [ "-Wno-bool-operation" ]

View File

@ -79,7 +79,9 @@ const AVCodecTag ff_codec_movsubtitle_tags[] = {
{ AV_CODEC_ID_MOV_TEXT, MKTAG('t', 'e', 'x', 't') },
{ AV_CODEC_ID_MOV_TEXT, MKTAG('t', 'x', '3', 'g') },
{ AV_CODEC_ID_EIA_608, MKTAG('c', '6', '0', '8') },
#ifdef OHOS_SUBTITLE_DEMUXER
{ AV_CODEC_ID_WEBVTT, MKTAG('w', 'v', 't', 't') },
#endif
{ AV_CODEC_ID_NONE, 0 },
};

View File

@ -801,7 +801,11 @@ static int mov_read_hdlr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
else if (type == MKTAG('m','1','a',' '))
st->codecpar->codec_id = AV_CODEC_ID_MP2;
#ifdef OHOS_SUBTITLE_DEMUXER
else if ((type == MKTAG('s','u','b','p')) || (type == MKTAG('c','l','c','p')) || (type == MKTAG('t','e','x','t')))
#else
else if ((type == MKTAG('s','u','b','p')) || (type == MKTAG('c','l','c','p')))
#endif
st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
#ifdef OHOS_TIMED_META_TRACK
else if (type == MKTAG('m', 'e', 't', 'a'))
@ -9021,6 +9025,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
}
return ret;
}
#ifdef OHOS_SUBTITLE_DEMUXER
if (st->codecpar->codec_id == AV_CODEC_ID_WEBVTT) {
if (pkt->size >= 8) {
uint32_t type = AV_RL32(pkt->data + 4);
@ -9041,6 +9046,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
}
memmove(pkt->data, payload_data, move_size);
pkt->size = payload_size;
pkt->data[pkt->size] = '\0';
break;
} else {
if (temp_size > payload_size) {
@ -9053,6 +9059,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
}
}
}
#endif
#if CONFIG_DV_DEMUXER
if (mov->dv_demux && sc->dv_audio_container) {
ret = avpriv_dv_produce_packet(mov->dv_demux, pkt, pkt->data, pkt->size, pkt->pos);

View File

@ -288,6 +288,22 @@ int ff_subtitles_queue_seek(FFDemuxSubtitlesQueue *q, AVFormatContext *s, int st
break;
}
#ifdef OHOS_SUBTITLE_DEMUXER
if (q->subs[idx]->pts + q->subs[idx]->duration < ts) {
if (idx < 1)
idx = 1;
for (i = idx - 1; i < q->nb_subs; i++) {
int64_t pts = q->subs[i]->pts;
if (q->subs[i]->duration <= 0 ||
(stream_index != -1 && q->subs[i]->stream_index != stream_index))
continue;
if (pts + q->subs[i]->duration >= ts) {
idx = i;
break;
}
}
}
#endif
/* If the queue is used to store multiple subtitles streams (like with
* VobSub) and the stream index is not specified, we need to make sure
* to focus on the smallest file position offset for a same timestamp;