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 _______________________________________________ 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".