Commit 72dac5d5c0 for ffmpeg
commit 72dac5d5c05f9f65d409a1b476055e327c25166e
Author: Kacper Michajłow <kasper93@gmail.com>
Date: Wed Oct 28 06:01:51 2026 +0100
avformat/msf: compute the packet size in read_header
The packet size was derived from the codecpar channel count on every
read. For MP3, which is parsed, the channel count of the parser's codec
context is copied back to codecpar, 0 when the decoder could not be
opened, and the empty packets that followed never reached EOF, so
seek_frame_generic() looped forever.
Signed-off-by: Kacper Michajłow <kasper93@gmail.com>
diff --git a/libavformat/msf.c b/libavformat/msf.c
index 37e05b538b..3a25ede752 100644
--- a/libavformat/msf.c
+++ b/libavformat/msf.c
@@ -24,6 +24,10 @@
#include "demux.h"
#include "internal.h"
+typedef struct MSFDemuxContext {
+ int packet_size;
+} MSFDemuxContext;
+
static int msf_probe(const AVProbeData *p)
{
if (memcmp(p->buf, "MSF", 3))
@@ -43,6 +47,7 @@ static int msf_probe(const AVProbeData *p)
static int msf_read_header(AVFormatContext *s)
{
+ MSFDemuxContext *msf = s->priv_data;
unsigned codec, size;
AVStream *st;
int ret;
@@ -90,6 +95,8 @@ static int msf_read_header(AVFormatContext *s)
avpriv_request_sample(s, "Codec %d", codec);
return AVERROR_PATCHWELCOME;
}
+ msf->packet_size = st->codecpar->block_align ? st->codecpar->block_align
+ : 1024 * st->codecpar->ch_layout.nb_channels;
st->duration = av_get_audio_frame_duration2(st->codecpar, size);
avio_skip(s->pb, 0x40 - avio_tell(s->pb));
avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
@@ -99,15 +106,16 @@ static int msf_read_header(AVFormatContext *s)
static int msf_read_packet(AVFormatContext *s, AVPacket *pkt)
{
- AVCodecParameters *par = s->streams[0]->codecpar;
+ MSFDemuxContext *msf = s->priv_data;
- return av_get_packet(s->pb, pkt, par->block_align ? par->block_align : 1024 * par->ch_layout.nb_channels);
+ return av_get_packet(s->pb, pkt, msf->packet_size);
}
const FFInputFormat ff_msf_demuxer = {
.p.name = "msf",
.p.long_name = NULL_IF_CONFIG_SMALL("Sony PS3 MSF"),
.p.extensions = "msf",
+ .priv_data_size = sizeof(MSFDemuxContext),
.read_probe = msf_probe,
.read_header = msf_read_header,
.read_packet = msf_read_packet,