コード例 #1
0
ファイル: adtsenc.c プロジェクト: genesi/gst-ffmpeg
int ff_adts_decode_extradata(AVFormatContext *s, ADTSContext *adts, uint8_t *buf, int size)
{
    GetBitContext gb;
    PutBitContext pb;
    MPEG4AudioConfig m4ac;
    int off;

    init_get_bits(&gb, buf, size * 8);
    off = ff_mpeg4audio_get_config(&m4ac, buf, size);
    if (off < 0)
        return off;
    skip_bits_long(&gb, off);
    adts->objecttype        = m4ac.object_type - 1;
    adts->sample_rate_index = m4ac.sampling_index;
    adts->channel_conf      = m4ac.chan_config;

    if (adts->objecttype > 3U) {
        av_log(s, AV_LOG_ERROR, "MPEG-4 AOT %d is not allowed in ADTS\n", adts->objecttype+1);
        return -1;
    }
    if (adts->sample_rate_index == 15) {
        av_log(s, AV_LOG_ERROR, "Escape sample rate index illegal in ADTS\n");
        return -1;
    }
    if (get_bits(&gb, 1)) {
        av_log(s, AV_LOG_ERROR, "960/120 MDCT window is not allowed in ADTS\n");
        return -1;
    }
    if (get_bits(&gb, 1)) {
        av_log(s, AV_LOG_ERROR, "Scalable configurations are not allowed in ADTS\n");
        return -1;
    }
    if (get_bits(&gb, 1)) {
        av_log(s, AV_LOG_ERROR, "Extension flag is not allowed in ADTS\n");
        return -1;
    }
    if (!adts->channel_conf) {
        init_put_bits(&pb, adts->pce_data, MAX_PCE_SIZE);

        put_bits(&pb, 3, 5); //ID_PCE
        adts->pce_size = (ff_copy_pce_data(&pb, &gb) + 3) / 8;
        flush_put_bits(&pb);
    }

    adts->write_adts = 1;

    return 0;
}
コード例 #2
0
int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb)
{
	int len, tag;
	int object_type_id = avio_r8(pb);
	avio_r8(pb); /* stream type */
	avio_rb24(pb); /* buffer size db */
	avio_rb32(pb); /* max bitrate */
	avio_rb32(pb); /* avg bitrate */

	st->codec->codec_id= ff_codec_get_id(ff_mp4_obj_type, object_type_id);
	av_dlog(fc, "esds object type id 0x%02x\n", object_type_id);
	len = ff_mp4_read_descr(fc, pb, &tag);
	if (tag == MP4DecSpecificDescrTag)
	{
		av_dlog(fc, "Specific MPEG4 header len=%d\n", len);
		if((uint64_t)len > (1<<30))
			return -1;
		av_free(st->codec->extradata);
		st->codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
		if (!st->codec->extradata)
			return AVERROR(ENOMEM);
		avio_read(pb, st->codec->extradata, len);
		st->codec->extradata_size = len;
		if (st->codec->codec_id == CODEC_ID_AAC)
		{
			MPEG4AudioConfig cfg;
			ff_mpeg4audio_get_config(&cfg, st->codec->extradata,
			                         st->codec->extradata_size);
			st->codec->channels = cfg.channels;
			if (cfg.object_type == 29 && cfg.sampling_index < 3) // old mp3on4
				st->codec->sample_rate = ff_mpa_freq_tab[cfg.sampling_index];
			else if (cfg.ext_sample_rate)
				st->codec->sample_rate = cfg.ext_sample_rate;
			else
				st->codec->sample_rate = cfg.sample_rate;
			av_dlog(fc, "mp4a config channels %d obj %d ext obj %d "
			        "sample rate %d ext sample rate %d\n", st->codec->channels,
			        cfg.object_type, cfg.ext_object_type,
			        cfg.sample_rate, cfg.ext_sample_rate);
			if (!(st->codec->codec_id = ff_codec_get_id(mp4_audio_types,
			                            cfg.object_type)))
				st->codec->codec_id = CODEC_ID_AAC;
		}
	}
	return 0;
}