Commit d4e0130e authored by Baptiste Coudurier's avatar Baptiste Coudurier

In mov muxer, mux adpcm_ms and adpcm_ima_wav the way quicktime supports it.

In mov demuxer, set adpcm_ms and adpcm_ima_wav frame size to stsd samples per packet.
parent e7b95918
...@@ -1227,6 +1227,7 @@ int ff_mov_read_stsd_entries(MOVContext *c, ByteIOContext *pb, int entries) ...@@ -1227,6 +1227,7 @@ int ff_mov_read_stsd_entries(MOVContext *c, ByteIOContext *pb, int entries)
case CODEC_ID_GSM: case CODEC_ID_GSM:
case CODEC_ID_ADPCM_MS: case CODEC_ID_ADPCM_MS:
case CODEC_ID_ADPCM_IMA_WAV: case CODEC_ID_ADPCM_IMA_WAV:
st->codec->frame_size = sc->samples_per_frame;
st->codec->block_align = sc->bytes_per_frame; st->codec->block_align = sc->bytes_per_frame;
break; break;
case CODEC_ID_ALAC: case CODEC_ID_ALAC:
......
...@@ -314,6 +314,16 @@ static int mov_pcm_le_gt16(enum CodecID codec_id) ...@@ -314,6 +314,16 @@ static int mov_pcm_le_gt16(enum CodecID codec_id)
codec_id == CODEC_ID_PCM_F64LE; codec_id == CODEC_ID_PCM_F64LE;
} }
static int mov_write_ms_tag(ByteIOContext *pb, MOVTrack *track)
{
int64_t pos = url_ftell(pb);
put_be32(pb, 0);
put_le32(pb, track->tag);
track->enc->codec_tag = track->tag >> 16;
ff_put_wav_header(pb, track->enc);
return updateSize(pb, pos);
}
static int mov_write_wave_tag(ByteIOContext *pb, MOVTrack *track) static int mov_write_wave_tag(ByteIOContext *pb, MOVTrack *track)
{ {
int64_t pos = url_ftell(pb); int64_t pos = url_ftell(pb);
...@@ -339,6 +349,9 @@ static int mov_write_wave_tag(ByteIOContext *pb, MOVTrack *track) ...@@ -339,6 +349,9 @@ static int mov_write_wave_tag(ByteIOContext *pb, MOVTrack *track)
mov_write_ac3_tag(pb, track); mov_write_ac3_tag(pb, track);
} else if (track->enc->codec_id == CODEC_ID_ALAC) { } else if (track->enc->codec_id == CODEC_ID_ALAC) {
mov_write_extradata_tag(pb, track); mov_write_extradata_tag(pb, track);
} else if (track->enc->codec_id == CODEC_ID_ADPCM_MS ||
track->enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) {
mov_write_ms_tag(pb, track);
} }
put_be32(pb, 8); /* size */ put_be32(pb, 8); /* size */
...@@ -395,7 +408,9 @@ static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack *track) ...@@ -395,7 +408,9 @@ static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack *track)
if (mov_get_lpcm_flags(track->enc->codec_id)) if (mov_get_lpcm_flags(track->enc->codec_id))
tag = AV_RL32("lpcm"); tag = AV_RL32("lpcm");
version = 2; version = 2;
} else if (track->audio_vbr || mov_pcm_le_gt16(track->enc->codec_id)) { } else if (track->audio_vbr || mov_pcm_le_gt16(track->enc->codec_id) ||
track->enc->codec_id == CODEC_ID_ADPCM_MS ||
track->enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) {
version = 1; version = 1;
} }
} }
...@@ -457,6 +472,8 @@ static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack *track) ...@@ -457,6 +472,8 @@ static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack *track)
track->enc->codec_id == CODEC_ID_AC3 || track->enc->codec_id == CODEC_ID_AC3 ||
track->enc->codec_id == CODEC_ID_AMR_NB || track->enc->codec_id == CODEC_ID_AMR_NB ||
track->enc->codec_id == CODEC_ID_ALAC || track->enc->codec_id == CODEC_ID_ALAC ||
track->enc->codec_id == CODEC_ID_ADPCM_MS ||
track->enc->codec_id == CODEC_ID_ADPCM_IMA_WAV ||
mov_pcm_le_gt16(track->enc->codec_id))) mov_pcm_le_gt16(track->enc->codec_id)))
mov_write_wave_tag(pb, track); mov_write_wave_tag(pb, track);
else if(track->tag == MKTAG('m','p','4','a')) else if(track->tag == MKTAG('m','p','4','a'))
...@@ -1909,6 +1926,9 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -1909,6 +1926,9 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
av_log(s, AV_LOG_ERROR, "fatal error, input is not a single packet, implement a AVParser for it\n"); av_log(s, AV_LOG_ERROR, "fatal error, input is not a single packet, implement a AVParser for it\n");
return -1; return -1;
} }
} else if (enc->codec_id == CODEC_ID_ADPCM_MS ||
enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) {
samplesInChunk = enc->frame_size;
} else if (trk->sampleSize) } else if (trk->sampleSize)
samplesInChunk = size/trk->sampleSize; samplesInChunk = size/trk->sampleSize;
else else
...@@ -2108,6 +2128,13 @@ static int mov_write_header(AVFormatContext *s) ...@@ -2108,6 +2128,13 @@ static int mov_write_header(AVFormatContext *s)
if(!st->codec->frame_size && !av_get_bits_per_sample(st->codec->codec_id)) { if(!st->codec->frame_size && !av_get_bits_per_sample(st->codec->codec_id)) {
av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i); av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i);
goto error; goto error;
}else if(st->codec->codec_id == CODEC_ID_ADPCM_MS ||
st->codec->codec_id == CODEC_ID_ADPCM_IMA_WAV){
if (!st->codec->block_align) {
av_log(s, AV_LOG_ERROR, "track %d: codec block align is not set for adpcm\n", i);
goto error;
}
track->sampleSize = st->codec->block_align;
}else if(st->codec->frame_size > 1){ /* assume compressed audio */ }else if(st->codec->frame_size > 1){ /* assume compressed audio */
track->audio_vbr = 1; track->audio_vbr = 1;
}else{ }else{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment