[FFmpeg-devel] [PATCH 029/281] apm: convert to new channel layout API

James Almer jamrial at gmail.com
Thu Jan 13 03:49:51 EET 2022


Signed-off-by: James Almer <jamrial at gmail.com>
---
 libavformat/apm.c | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/libavformat/apm.c b/libavformat/apm.c
index 1ced771745..6af0e1bdcb 100644
--- a/libavformat/apm.c
+++ b/libavformat/apm.c
@@ -104,6 +104,7 @@ static int apm_read_header(AVFormatContext *s)
     APMExtraData extradata;
     AVCodecParameters *par;
     uint8_t buf[APM_FILE_EXTRADATA_SIZE];
+    int channels;
 
     if (!(st = avformat_new_stream(s, NULL)))
         return AVERROR(ENOMEM);
@@ -116,7 +117,7 @@ static int apm_read_header(AVFormatContext *s)
         return AVERROR_INVALIDDATA;
 
     par = st->codecpar;
-    par->channels              = avio_rl16(s->pb);
+    channels                   = avio_rl16(s->pb);
     par->sample_rate           = avio_rl32(s->pb);
 
     /* Skip the bitrate, it's usually wrong anyway. */
@@ -136,17 +137,14 @@ static int apm_read_header(AVFormatContext *s)
     if (par->bits_per_coded_sample != 4)
         return AVERROR_INVALIDDATA;
 
-    if (par->channels == 2)
-        par->channel_layout    = AV_CH_LAYOUT_STEREO;
-    else if (par->channels == 1)
-        par->channel_layout    = AV_CH_LAYOUT_MONO;
-    else
+    if (channels > 2)
         return AVERROR_INVALIDDATA;
 
+    av_channel_layout_default(&par->ch_layout, channels);
     par->codec_type            = AVMEDIA_TYPE_AUDIO;
     par->codec_id              = AV_CODEC_ID_ADPCM_IMA_APM;
     par->format                = AV_SAMPLE_FMT_S16;
-    par->bit_rate              = par->channels *
+    par->bit_rate              = par->ch_layout.nb_channels *
                                  par->sample_rate *
                                  par->bits_per_coded_sample;
 
@@ -175,7 +173,7 @@ static int apm_read_header(AVFormatContext *s)
     st->start_time  = 0;
     st->duration    = extradata.data_size *
                       (8 / par->bits_per_coded_sample) /
-                      par->channels;
+                      par->ch_layout.nb_channels;
     return 0;
 }
 
@@ -195,7 +193,7 @@ static int apm_read_packet(AVFormatContext *s, AVPacket *pkt)
 
     pkt->flags          &= ~AV_PKT_FLAG_CORRUPT;
     pkt->stream_index   = 0;
-    pkt->duration       = ret * (8 / par->bits_per_coded_sample) / par->channels;
+    pkt->duration       = ret * (8 / par->bits_per_coded_sample) / par->ch_layout.nb_channels;
 
     return 0;
 }
@@ -227,7 +225,7 @@ static int apm_write_init(AVFormatContext *s)
         return AVERROR(EINVAL);
     }
 
-    if (par->channels > 2) {
+    if (par->ch_layout.nb_channels > 2) {
         av_log(s, AV_LOG_ERROR, "APM files only support up to 2 channels\n");
         return AVERROR(EINVAL);
     }
@@ -260,10 +258,10 @@ static int apm_write_header(AVFormatContext *s)
      * be used because of the extra 2 bytes.
      */
     avio_wl16(s->pb, APM_TAG_CODEC);
-    avio_wl16(s->pb, par->channels);
+    avio_wl16(s->pb, par->ch_layout.nb_channels);
     avio_wl32(s->pb, par->sample_rate);
     /* This is the wrong calculation, but it's what the orginal files have. */
-    avio_wl32(s->pb, par->sample_rate * par->channels * 2);
+    avio_wl32(s->pb, par->sample_rate * par->ch_layout.nb_channels * 2);
     avio_wl16(s->pb, par->block_align);
     avio_wl16(s->pb, par->bits_per_coded_sample);
     avio_wl32(s->pb, APM_FILE_EXTRADATA_SIZE);
-- 
2.34.1



More information about the ffmpeg-devel mailing list