/* Returns the number of sound data frames or negative on error */ unsigned int get_aiff_header(ByteIOContext *pb, AVCodecContext *codec, int size, unsigned version) { AVExtFloat ext; double sample_rate; unsigned int num_frames; if (size & 1) size++; codec->codec_type = CODEC_TYPE_AUDIO; codec->channels = get_be16(pb); num_frames = get_be32(pb); codec->bits_per_sample = get_be16(pb); get_buffer(pb, (uint8_t*)&ext, sizeof(ext));/* Sample rate is in */ sample_rate = av_ext2dbl(ext); /* 80 bits BE IEEE extended float */ codec->sample_rate = sample_rate; size -= 18; /* Got an AIFF-C? */ if (version == AIFF_C_VERSION1) { codec->codec_tag = get_le32(pb); codec->codec_id = codec_get_id (codec_aiff_tags, codec->codec_tag); if (codec->codec_id == CODEC_ID_PCM_S16BE) { codec->codec_id = aiff_codec_get_id (codec->bits_per_sample); codec->bits_per_sample = fix_bps(codec->codec_id); } size -= 4; } else { /* Need the codec type */ codec->codec_id = aiff_codec_get_id (codec->bits_per_sample); codec->bits_per_sample = fix_bps(codec->codec_id); } if (!codec->codec_id) return AVERROR_INVALIDDATA; /* Block align needs to be computed in all cases, as the definition * is specific to applications -> here we use the WAVE format definition */ codec->block_align = (codec->bits_per_sample * codec->channels) >> 3; codec->bit_rate = codec->sample_rate * codec->block_align; /* Chunk is over */ if (size) url_fseek(pb, size, SEEK_CUR); return num_frames; }
/* Returns the number of sound data frames or negative on error */ static unsigned int get_aiff_header(AVIOContext *pb, AVCodecContext *codec, int size, unsigned version) { AVExtFloat ext; double sample_rate; unsigned int num_frames; if (size & 1) size++; codec->codec_type = AVMEDIA_TYPE_AUDIO; codec->channels = avio_rb16(pb); num_frames = avio_rb32(pb); codec->bits_per_coded_sample = avio_rb16(pb); avio_read(pb, (uint8_t*)&ext, sizeof(ext));/* Sample rate is in */ sample_rate = av_ext2dbl(ext); /* 80 bits BE IEEE extended float */ codec->sample_rate = sample_rate; size -= 18; /* Got an AIFF-C? */ if (version == AIFF_C_VERSION1) { codec->codec_tag = avio_rl32(pb); codec->codec_id = ff_codec_get_id(ff_codec_aiff_tags, codec->codec_tag); switch (codec->codec_id) { case CODEC_ID_PCM_S16BE: codec->codec_id = aiff_codec_get_id(codec->bits_per_coded_sample); codec->bits_per_coded_sample = av_get_bits_per_sample(codec->codec_id); break; case CODEC_ID_ADPCM_IMA_QT: codec->block_align = 34*codec->channels; codec->frame_size = 64; break; case CODEC_ID_MACE3: codec->block_align = 2*codec->channels; codec->frame_size = 6; break; case CODEC_ID_MACE6: codec->block_align = 1*codec->channels; codec->frame_size = 6; break; case CODEC_ID_GSM: codec->block_align = 33; codec->frame_size = 160; break; case CODEC_ID_QCELP: codec->block_align = 35; codec->frame_size= 160; break; default: break; } size -= 4; } else { /* Need the codec type */ codec->codec_id = aiff_codec_get_id(codec->bits_per_coded_sample); codec->bits_per_coded_sample = av_get_bits_per_sample(codec->codec_id); } /* Block align needs to be computed in all cases, as the definition * is specific to applications -> here we use the WAVE format definition */ if (!codec->block_align) codec->block_align = (codec->bits_per_coded_sample * codec->channels) >> 3; codec->bit_rate = (codec->frame_size ? codec->sample_rate/codec->frame_size : codec->sample_rate) * (codec->block_align << 3); /* Chunk is over */ if (size) avio_skip(pb, size); return num_frames; }