Andreas Rheinhardt: > Currently Musepack allocates an array that needs to be freed later in > the demuxer's read_close-function; it is the sole reason for said > function's existence. But it is unnecessary, because one can store this > array in the stream's priv_data pointer, so that it will be freed > generically. > > Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@gmail.com> > --- > libavformat/mpc.c | 40 ++++++++++++++++------------------------ > 1 file changed, 16 insertions(+), 24 deletions(-) > > diff --git a/libavformat/mpc.c b/libavformat/mpc.c > index 85036cd118..6a94b5d1d0 100644 > --- a/libavformat/mpc.c > +++ b/libavformat/mpc.c > @@ -57,6 +57,7 @@ static int mpc_read_header(AVFormatContext *s) > { > MPCContext *c = s->priv_data; > AVStream *st; > + int ret; > > if(avio_rl24(s->pb) != MKTAG('M', 'P', '+', 0)){ > av_log(s, AV_LOG_ERROR, "Not a Musepack file\n"); > @@ -72,15 +73,6 @@ static int mpc_read_header(AVFormatContext *s) > av_log(s, AV_LOG_ERROR, "Too many frames, seeking is not > possible\n"); > return AVERROR_INVALIDDATA; > } > - if(c->fcount){ > - c->frames = av_malloc(c->fcount * sizeof(MPCFrame)); > - if(!c->frames){ > - av_log(s, AV_LOG_ERROR, "Cannot allocate seektable\n"); > - return AVERROR(ENOMEM); > - } > - }else{ > - av_log(s, AV_LOG_WARNING, "Container reports no frames\n"); > - } > c->curframe = 0; > c->lastframe = -1; > c->curbits = 8; > @@ -88,15 +80,27 @@ static int mpc_read_header(AVFormatContext *s) > > st = avformat_new_stream(s, NULL); > if (!st) > - goto mem_error; > + return AVERROR(ENOMEM); > + > + if (c->fcount) { > + c->frames = av_malloc(c->fcount * sizeof(MPCFrame)); > + if (!c->frames) { > + av_log(s, AV_LOG_ERROR, "Cannot allocate seektable\n"); > + return AVERROR(ENOMEM); > + } > + st->priv_data = c->frames; > + } else { > + av_log(s, AV_LOG_WARNING, "Container reports no frames\n"); > + } > + > st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; > st->codecpar->codec_id = AV_CODEC_ID_MUSEPACK7; > st->codecpar->channels = 2; > st->codecpar->channel_layout = AV_CH_LAYOUT_STEREO; > st->codecpar->bits_per_coded_sample = 16; > > - if (ff_get_extradata(s, st->codecpar, s->pb, 16) < 0) > - goto mem_error; > + if ((ret = ff_get_extradata(s, st->codecpar, s->pb, 16)) < 0) > + return ret; > st->codecpar->sample_rate = mpc_rate[st->codecpar->extradata[2] & 3]; > avpriv_set_pts_info(st, 32, MPC_FRAMESIZE, st->codecpar->sample_rate); > /* scan for seekpoints */ > @@ -113,9 +117,6 @@ static int mpc_read_header(AVFormatContext *s) > } > > return 0; > -mem_error: > - av_freep(&c->frames); > - return AVERROR(ENOMEM); > } > > static int mpc_read_packet(AVFormatContext *s, AVPacket *pkt) > @@ -176,14 +177,6 @@ static int mpc_read_packet(AVFormatContext *s, AVPacket > *pkt) > return 0; > } > > -static int mpc_read_close(AVFormatContext *s) > -{ > - MPCContext *c = s->priv_data; > - > - av_freep(&c->frames); > - return 0; > -} > - > /** > * Seek to the given position > * If position is unknown but is within the limits of file > @@ -232,7 +225,6 @@ AVInputFormat ff_mpc_demuxer = { > .read_probe = mpc_probe, > .read_header = mpc_read_header, > .read_packet = mpc_read_packet, > - .read_close = mpc_read_close, > .read_seek = mpc_read_seek, > .extensions = "mpc", > }; > Will push tomorrow if there are no objections.
- 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".