1/* 2 * Core Audio Format muxer 3 * Copyright (c) 2011 Carl Eugen Hoyos 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#include "avformat.h" 23#include "caf.h" 24#include "isom.h" 25#include "avio_internal.h" 26#include "mux.h" 27#include "libavutil/intfloat.h" 28#include "libavutil/dict.h" 29 30#define FRAME_SIZE_OFFSET 40 31 32typedef struct { 33 int64_t data; 34 int size_buffer_size; 35 int size_entries_used; 36 int packets; 37} CAFContext; 38 39static uint32_t codec_flags(enum AVCodecID codec_id) { 40 switch (codec_id) { 41 case AV_CODEC_ID_PCM_F32BE: 42 case AV_CODEC_ID_PCM_F64BE: 43 return 1; //< kCAFLinearPCMFormatFlagIsFloat 44 case AV_CODEC_ID_PCM_S16LE: 45 case AV_CODEC_ID_PCM_S24LE: 46 case AV_CODEC_ID_PCM_S32LE: 47 return 2; //< kCAFLinearPCMFormatFlagIsLittleEndian 48 case AV_CODEC_ID_PCM_F32LE: 49 case AV_CODEC_ID_PCM_F64LE: 50 return 3; //< kCAFLinearPCMFormatFlagIsFloat | kCAFLinearPCMFormatFlagIsLittleEndian 51 default: 52 return 0; 53 } 54} 55 56static uint32_t samples_per_packet(const AVCodecParameters *par) { 57 enum AVCodecID codec_id = par->codec_id; 58 int channels = par->ch_layout.nb_channels, block_align = par->block_align; 59 int frame_size = par->frame_size, sample_rate = par->sample_rate; 60 61 switch (codec_id) { 62 case AV_CODEC_ID_PCM_S8: 63 case AV_CODEC_ID_PCM_S16LE: 64 case AV_CODEC_ID_PCM_S16BE: 65 case AV_CODEC_ID_PCM_S24LE: 66 case AV_CODEC_ID_PCM_S24BE: 67 case AV_CODEC_ID_PCM_S32LE: 68 case AV_CODEC_ID_PCM_S32BE: 69 case AV_CODEC_ID_PCM_F32LE: 70 case AV_CODEC_ID_PCM_F32BE: 71 case AV_CODEC_ID_PCM_F64LE: 72 case AV_CODEC_ID_PCM_F64BE: 73 case AV_CODEC_ID_PCM_ALAW: 74 case AV_CODEC_ID_PCM_MULAW: 75 return 1; 76 case AV_CODEC_ID_MACE3: 77 case AV_CODEC_ID_MACE6: 78 return 6; 79 case AV_CODEC_ID_ADPCM_IMA_QT: 80 return 64; 81 case AV_CODEC_ID_AMR_NB: 82 case AV_CODEC_ID_GSM: 83 case AV_CODEC_ID_ILBC: 84 case AV_CODEC_ID_QCELP: 85 return 160; 86 case AV_CODEC_ID_GSM_MS: 87 return 320; 88 case AV_CODEC_ID_MP1: 89 return 384; 90 case AV_CODEC_ID_OPUS: 91 return frame_size * 48000 / sample_rate; 92 case AV_CODEC_ID_MP2: 93 case AV_CODEC_ID_MP3: 94 return 1152; 95 case AV_CODEC_ID_AC3: 96 return 1536; 97 case AV_CODEC_ID_QDM2: 98 case AV_CODEC_ID_QDMC: 99 return 2048 * channels; 100 case AV_CODEC_ID_ALAC: 101 return 4096; 102 case AV_CODEC_ID_ADPCM_IMA_WAV: 103 return (block_align - 4 * channels) * 8 / (4 * channels) + 1; 104 case AV_CODEC_ID_ADPCM_MS: 105 return (block_align - 7 * channels) * 2 / channels + 2; 106 default: 107 return 0; 108 } 109} 110 111static int caf_write_header(AVFormatContext *s) 112{ 113 AVIOContext *pb = s->pb; 114 AVCodecParameters *par = s->streams[0]->codecpar; 115 CAFContext *caf = s->priv_data; 116 AVDictionaryEntry *t = NULL; 117 unsigned int codec_tag = ff_codec_get_tag(ff_codec_caf_tags, par->codec_id); 118 int64_t chunk_size = 0; 119 int frame_size = par->frame_size, sample_rate = par->sample_rate; 120 121 if (s->nb_streams != 1) { 122 av_log(s, AV_LOG_ERROR, "CAF files have exactly one stream\n"); 123 return AVERROR(EINVAL); 124 } 125 126 switch (par->codec_id) { 127 case AV_CODEC_ID_AAC: 128 av_log(s, AV_LOG_ERROR, "muxing codec currently unsupported\n"); 129 return AVERROR_PATCHWELCOME; 130 } 131 132 if (par->codec_id == AV_CODEC_ID_OPUS && par->ch_layout.nb_channels > 2) { 133 av_log(s, AV_LOG_ERROR, "Only mono and stereo are supported for Opus\n"); 134 return AVERROR_INVALIDDATA; 135 } 136 137 if (!codec_tag) { 138 av_log(s, AV_LOG_ERROR, "unsupported codec\n"); 139 return AVERROR_INVALIDDATA; 140 } 141 142 if (!par->block_align && !(pb->seekable & AVIO_SEEKABLE_NORMAL)) { 143 av_log(s, AV_LOG_ERROR, "Muxing variable packet size not supported on non seekable output\n"); 144 return AVERROR_INVALIDDATA; 145 } 146 147 if (par->codec_id != AV_CODEC_ID_MP3 || frame_size != 576) 148 frame_size = samples_per_packet(par); 149 150 if (par->codec_id == AV_CODEC_ID_OPUS) 151 sample_rate = 48000; 152 153 ffio_wfourcc(pb, "caff"); //< mFileType 154 avio_wb16(pb, 1); //< mFileVersion 155 avio_wb16(pb, 0); //< mFileFlags 156 157 ffio_wfourcc(pb, "desc"); //< Audio Description chunk 158 avio_wb64(pb, 32); //< mChunkSize 159 avio_wb64(pb, av_double2int(sample_rate)); //< mSampleRate 160 avio_wl32(pb, codec_tag); //< mFormatID 161 avio_wb32(pb, codec_flags(par->codec_id)); //< mFormatFlags 162 avio_wb32(pb, par->block_align); //< mBytesPerPacket 163 avio_wb32(pb, frame_size); //< mFramesPerPacket 164 avio_wb32(pb, par->ch_layout.nb_channels); //< mChannelsPerFrame 165 avio_wb32(pb, av_get_bits_per_sample(par->codec_id)); //< mBitsPerChannel 166 167 if (par->ch_layout.order == AV_CHANNEL_ORDER_NATIVE) { 168 ffio_wfourcc(pb, "chan"); 169 avio_wb64(pb, 12); 170 ff_mov_write_chan(pb, par->ch_layout.u.mask); 171 } 172 173 if (par->codec_id == AV_CODEC_ID_ALAC) { 174 ffio_wfourcc(pb, "kuki"); 175 avio_wb64(pb, 12 + par->extradata_size); 176 avio_write(pb, "\0\0\0\14frmaalac", 12); 177 avio_write(pb, par->extradata, par->extradata_size); 178 } else if (par->codec_id == AV_CODEC_ID_AMR_NB) { 179 ffio_wfourcc(pb, "kuki"); 180 avio_wb64(pb, 29); 181 avio_write(pb, "\0\0\0\14frmasamr", 12); 182 avio_wb32(pb, 0x11); /* size */ 183 avio_write(pb, "samrFFMP", 8); 184 avio_w8(pb, 0); /* decoder version */ 185 186 avio_wb16(pb, 0x81FF); /* Mode set (all modes for AMR_NB) */ 187 avio_w8(pb, 0x00); /* Mode change period (no restriction) */ 188 avio_w8(pb, 0x01); /* Frames per sample */ 189 } else if (par->codec_id == AV_CODEC_ID_QDM2 || par->codec_id == AV_CODEC_ID_QDMC) { 190 ffio_wfourcc(pb, "kuki"); 191 avio_wb64(pb, par->extradata_size); 192 avio_write(pb, par->extradata, par->extradata_size); 193 } 194 195 ff_standardize_creation_time(s); 196 if (av_dict_count(s->metadata)) { 197 ffio_wfourcc(pb, "info"); //< Information chunk 198 while ((t = av_dict_get(s->metadata, "", t, AV_DICT_IGNORE_SUFFIX))) { 199 chunk_size += strlen(t->key) + strlen(t->value) + 2; 200 } 201 avio_wb64(pb, chunk_size + 4); 202 avio_wb32(pb, av_dict_count(s->metadata)); 203 t = NULL; 204 while ((t = av_dict_get(s->metadata, "", t, AV_DICT_IGNORE_SUFFIX))) { 205 avio_put_str(pb, t->key); 206 avio_put_str(pb, t->value); 207 } 208 } 209 210 ffio_wfourcc(pb, "data"); //< Audio Data chunk 211 caf->data = avio_tell(pb); 212 avio_wb64(pb, -1); //< mChunkSize 213 avio_wb32(pb, 0); //< mEditCount 214 215 return 0; 216} 217 218static int caf_write_packet(AVFormatContext *s, AVPacket *pkt) 219{ 220 CAFContext *caf = s->priv_data; 221 AVStream *const st = s->streams[0]; 222 223 if (!st->codecpar->block_align) { 224 uint8_t *pkt_sizes; 225 int i, alloc_size = caf->size_entries_used + 5U; 226 if (alloc_size < 0) 227 return AVERROR(ERANGE); 228 229 pkt_sizes = av_fast_realloc(st->priv_data, 230 &caf->size_buffer_size, 231 alloc_size); 232 if (!pkt_sizes) 233 return AVERROR(ENOMEM); 234 st->priv_data = pkt_sizes; 235 for (i = 4; i > 0; i--) { 236 unsigned top = pkt->size >> i * 7; 237 if (top) 238 pkt_sizes[caf->size_entries_used++] = 128 | top; 239 } 240 pkt_sizes[caf->size_entries_used++] = pkt->size & 127; 241 caf->packets++; 242 } 243 avio_write(s->pb, pkt->data, pkt->size); 244 return 0; 245} 246 247static int caf_write_trailer(AVFormatContext *s) 248{ 249 CAFContext *caf = s->priv_data; 250 AVIOContext *pb = s->pb; 251 AVStream *st = s->streams[0]; 252 AVCodecParameters *par = st->codecpar; 253 254 if (pb->seekable & AVIO_SEEKABLE_NORMAL) { 255 int64_t file_size = avio_tell(pb); 256 257 avio_seek(pb, caf->data, SEEK_SET); 258 avio_wb64(pb, file_size - caf->data - 8); 259 if (!par->block_align) { 260 int packet_size = samples_per_packet(par); 261 if (!packet_size) { 262 packet_size = st->duration / (caf->packets - 1); 263 avio_seek(pb, FRAME_SIZE_OFFSET, SEEK_SET); 264 avio_wb32(pb, packet_size); 265 } 266 avio_seek(pb, file_size, SEEK_SET); 267 ffio_wfourcc(pb, "pakt"); 268 avio_wb64(pb, caf->size_entries_used + 24U); 269 avio_wb64(pb, caf->packets); ///< mNumberPackets 270 avio_wb64(pb, caf->packets * packet_size); ///< mNumberValidFrames 271 avio_wb32(pb, 0); ///< mPrimingFrames 272 avio_wb32(pb, 0); ///< mRemainderFrames 273 avio_write(pb, st->priv_data, caf->size_entries_used); 274 } 275 } 276 return 0; 277} 278 279const AVOutputFormat ff_caf_muxer = { 280 .name = "caf", 281 .long_name = NULL_IF_CONFIG_SMALL("Apple CAF (Core Audio Format)"), 282 .mime_type = "audio/x-caf", 283 .extensions = "caf", 284 .priv_data_size = sizeof(CAFContext), 285 .audio_codec = AV_CODEC_ID_PCM_S16BE, 286 .video_codec = AV_CODEC_ID_NONE, 287 .write_header = caf_write_header, 288 .write_packet = caf_write_packet, 289 .write_trailer = caf_write_trailer, 290 .codec_tag = ff_caf_codec_tags_list, 291}; 292