X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fcafenc.c;h=0dd4b349ca4b4a3de95ce8adf26452a4d8ca512d;hb=23a287e9cc4bfebd98190f2442367f7c0c94099f;hp=1c7725160423f324200d202556442c138702d5f0;hpb=e2cc3311246376e902f0defc6c57bd554babcf39;p=ffmpeg diff --git a/libavformat/cafenc.c b/libavformat/cafenc.c index 1c772516042..0dd4b349ca4 100644 --- a/libavformat/cafenc.c +++ b/libavformat/cafenc.c @@ -107,10 +107,6 @@ static int caf_write_header(AVFormatContext *s) switch (enc->codec_id) { case CODEC_ID_AAC: case CODEC_ID_AC3: - case CODEC_ID_ALAC: - case CODEC_ID_AMR_NB: - case CODEC_ID_QCELP: - case CODEC_ID_QDM2: av_log(s, AV_LOG_ERROR, "muxing codec currently unsupported\n"); return AVERROR_PATCHWELCOME; } @@ -162,6 +158,28 @@ static int caf_write_header(AVFormatContext *s) ff_mov_write_chan(pb, enc->channel_layout); } + if (enc->codec_id == CODEC_ID_ALAC) { + ffio_wfourcc(pb, "kuki"); + avio_wb64(pb, 12 + enc->extradata_size); + avio_write(pb, "\0\0\0\14frmaalac", 12); + avio_write(pb, enc->extradata, enc->extradata_size); + } else if (enc->codec_id == CODEC_ID_AMR_NB) { + ffio_wfourcc(pb, "kuki"); + avio_wb64(pb, 29); + avio_write(pb, "\0\0\0\14frmasamr", 12); + avio_wb32(pb, 0x11); /* size */ + avio_write(pb, "samrFFMP", 8); + avio_w8(pb, 0); /* decoder version */ + + avio_wb16(pb, 0x81FF); /* Mode set (all modes for AMR_NB) */ + avio_w8(pb, 0x00); /* Mode change period (no restriction) */ + avio_w8(pb, 0x01); /* Frames per sample */ + } else if (enc->codec_id == CODEC_ID_QDM2) { + ffio_wfourcc(pb, "kuki"); + avio_wb64(pb, enc->extradata_size); + avio_write(pb, enc->extradata, enc->extradata_size); + } + ffio_wfourcc(pb, "data"); //< Audio Data chunk caf->data = avio_tell(pb); avio_wb64(pb, -1); //< mChunkSize