On Tue, Dec 24, 2019 at 1:58 AM Andreas Rheinhardt < andreas.rheinha...@gmail.com> wrote:
> Andreas Rheinhardt: > > Andreas Rheinhardt: > >> Andreas Rheinhardt: > >>> Andreas Rheinhardt: > >>>> When vobsub_read_packet() reads a packet, it uses a dedicated AVPacket > >>>> to get the subtitle timing and position from an FFDemuxSubtitlesQueue > >>>> (which has been filled with this data during reading the idx file in > >>>> vobsub_read_header); afterwards the actual subtitle data is read into > >>>> the packet destined for output and the timing and position are copied > >>>> to this packet. Afterwards, the local packet is unreferenced. > >>>> > >>>> This can be simplified: Simply use the output packet to get the timing > >>>> and position from the FFDemuxSubtitlesQueue. The packet's size will be > >>>> zero afterwards, so that it can be directly used to read the actual > >>>> subtitle data. This makes copying the packet fields as well as > >>>> unreferencing the local packet unecessary and also removes an instance > >>>> of usage of sizeof(AVPacket) in libavformat. > >>>> > >>>> The only difference is that the returned packet will already be > flagged > >>>> as a keyframe. This currently only happens in compute_pkt_fields(). > >>>> > >>>> Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@gmail.com> > >>>> --- > >>>> libavformat/mpeg.c | 23 +++++++---------------- > >>>> 1 file changed, 7 insertions(+), 16 deletions(-) > >>>> > >>>> diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c > >>>> index bd182e4429..7daa72f7ce 100644 > >>>> --- a/libavformat/mpeg.c > >>>> +++ b/libavformat/mpeg.c > >>>> @@ -912,7 +912,6 @@ static int vobsub_read_packet(AVFormatContext *s, > AVPacket *pkt) > >>>> FFDemuxSubtitlesQueue *q; > >>>> AVIOContext *pb = vobsub->sub_ctx->pb; > >>>> int ret, psize, total_read = 0, i; > >>>> - AVPacket idx_pkt = { 0 }; > >>>> > >>>> int64_t min_ts = INT64_MAX; > >>>> int sid = 0; > >>>> @@ -927,24 +926,22 @@ static int vobsub_read_packet(AVFormatContext > *s, AVPacket *pkt) > >>>> } > >>>> } > >>>> q = &vobsub->q[sid]; > >>>> - ret = ff_subtitles_queue_read_packet(q, &idx_pkt); > >>>> + /* The returned packet will have size zero, > >>>> + * so that it can be directly used with av_grow_packet. */ > >>>> + ret = ff_subtitles_queue_read_packet(q, pkt); > >>>> if (ret < 0) > >>>> return ret; > >>>> > >>>> /* compute maximum packet size using the next packet position. > This is > >>>> * useful when the len in the header is non-sense */ > >>>> if (q->current_sub_idx < q->nb_subs) { > >>>> - psize = q->subs[q->current_sub_idx].pos - idx_pkt.pos; > >>>> + psize = q->subs[q->current_sub_idx].pos - pkt->pos; > >>>> } else { > >>>> int64_t fsize = avio_size(pb); > >>>> - psize = fsize < 0 ? 0xffff : fsize - idx_pkt.pos; > >>>> + psize = fsize < 0 ? 0xffff : fsize - pkt->pos; > >>>> } > >>>> > >>>> - avio_seek(pb, idx_pkt.pos, SEEK_SET); > >>>> - > >>>> - av_init_packet(pkt); > >>>> - pkt->size = 0; > >>>> - pkt->data = NULL; > >>>> + avio_seek(pb, pkt->pos, SEEK_SET); > >>>> > >>>> do { > >>>> int n, to_read, startcode; > >>>> @@ -968,7 +965,7 @@ static int vobsub_read_packet(AVFormatContext *s, > AVPacket *pkt) > >>>> total_read += pkt_size; > >>>> > >>>> /* the current chunk doesn't match the stream index > (unlikely) */ > >>>> - if ((startcode & 0x1f) != > s->streams[idx_pkt.stream_index]->id) > >>>> + if ((startcode & 0x1f) != s->streams[pkt->stream_index]->id) > >>>> break; > >>>> > >>>> ret = av_grow_packet(pkt, to_read); > >>>> @@ -980,16 +977,10 @@ static int vobsub_read_packet(AVFormatContext > *s, AVPacket *pkt) > >>>> pkt->size -= to_read - n; > >>>> } while (total_read < psize); > >>>> > >>>> - pkt->pts = pkt->dts = idx_pkt.pts; > >>>> - pkt->pos = idx_pkt.pos; > >>>> - pkt->stream_index = idx_pkt.stream_index; > >>>> - > >>>> - av_packet_unref(&idx_pkt); > >>>> return 0; > >>>> > >>>> fail: > >>>> av_packet_unref(pkt); > >>>> - av_packet_unref(&idx_pkt); > >>>> return ret; > >>>> } > >>>> > >>>> > >>> Ping. > >>> > >>> - Andreas > >>> > >> Another ping for the three unmerged patches of this patchset. > >> > >> - Andreas > >> > > Another ping for the two unmerged patches of this patchset; and also > > for the other patch fixing uninitialized reads in the vobsub demuxer: > > https://ffmpeg.org/pipermail/ffmpeg-devel/2019-October/251961.html > > > > - Andreas > > > Ping. > > - Andreas > Ping. - Andreas _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".