mirror of
https://github.com/nyanmisaka/ffmpeg-rockchip.git
synced 2025-11-03 09:41:17 +08:00
avformat/utils: Fix confusing return value for ff_read_packet()
Currently, ff_read_packet() sometimes forwards the return value of
AVInputFormat.read_packet() (which should be zero on success, but isn't
for all demuxers) and sometimes it overwrites this with zero.
Furthermore, it uses two variables, one for the read_packet return value
and one for other errors, which is a bit confusing; it is also
unnecessary given that the documentation explicitly states that
ff_read_packet() never returns positive values. Returning a positive
value would lead to leaks with some callers (namely asfrtp_parse_packet
and estimate_timings_from_pts). So always return zero in case of
success.
(This behaviour stems from a time before av_read_packet sanitized
the return value of read_packet at all: It was added in commit
626004690c and was unnecessary since
88b00723906f68b7563214c30333e48888dddf78.)
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
@@ -810,7 +810,7 @@ static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_in
|
||||
|
||||
int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
{
|
||||
int ret, i, err;
|
||||
int err, i;
|
||||
AVStream *st;
|
||||
|
||||
#if FF_API_INIT_PACKET
|
||||
@@ -840,17 +840,17 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
}
|
||||
}
|
||||
|
||||
ret = s->iformat->read_packet(s, pkt);
|
||||
if (ret < 0) {
|
||||
err = s->iformat->read_packet(s, pkt);
|
||||
if (err < 0) {
|
||||
av_packet_unref(pkt);
|
||||
|
||||
/* Some demuxers return FFERROR_REDO when they consume
|
||||
data and discard it (ignored streams, junk, extradata).
|
||||
We must re-call the demuxer to get the real packet. */
|
||||
if (ret == FFERROR_REDO)
|
||||
if (err == FFERROR_REDO)
|
||||
continue;
|
||||
if (!pktl || ret == AVERROR(EAGAIN))
|
||||
return ret;
|
||||
if (!pktl || err == AVERROR(EAGAIN))
|
||||
return err;
|
||||
for (i = 0; i < s->nb_streams; i++) {
|
||||
st = s->streams[i];
|
||||
if (st->probe_packets || st->internal->request_probe > 0)
|
||||
@@ -904,7 +904,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
|
||||
|
||||
if (!pktl && st->internal->request_probe <= 0)
|
||||
return ret;
|
||||
return 0;
|
||||
|
||||
err = avpriv_packet_list_put(&s->internal->raw_packet_buffer,
|
||||
&s->internal->raw_packet_buffer_end,
|
||||
|
||||
Reference in New Issue
Block a user