diff --git a/codec.c b/codec.c index 41b0774..ce1e500 100644 --- a/codec.c +++ b/codec.c @@ -30,11 +30,6 @@ /// many bugs and incompatiblity in it. Don't use this shit. /// - /** - ** use av_parser to support insane dvb audio streams. - */ -#define noUSE_AVPARSER - /// compile with passthrough support (experimental) #define USE_PASSTHROUGH @@ -603,10 +598,6 @@ struct _audio_decoder_ AVCodec *AudioCodec; ///< audio codec AVCodecContext *AudioCtx; ///< audio codec context -#ifdef USE_AVPARSER - /// audio parser to support insane dvb streaks - AVCodecParserContext *AudioParser; -#endif int PassthroughAC3; ///< current ac-3 pass-through int SampleRate; ///< current stream sample rate int Channels; ///< current stream channels @@ -615,7 +606,6 @@ struct _audio_decoder_ int HwChannels; ///< hw channels ReSampleContext *ReSample; ///< audio resampling context - }; #ifdef USE_PASSTHROUGH @@ -667,7 +657,6 @@ void CodecAudioOpen(AudioDecoder * audio_decoder, const char *name, int codec_id) { AVCodec *audio_codec; - //AVDictionary *av_dict; if (name && (audio_codec = avcodec_find_decoder_by_name(name))) { Debug(3, "codec: audio decoder '%s' found\n", name); @@ -694,15 +683,20 @@ void CodecAudioOpen(AudioDecoder * audio_decoder, const char *name, Fatal(_("codec: can't open audio codec\n")); } #else - //av_dict = NULL; - //av_dict_set(&av_dict, "dmix_mode", "0", 0); - //av_dict_set(&av_dict, "ltrt_cmixlev", "1.414", 0); - //av_dict_set(&av_dict, "loro_cmixlev", "1.414", 0); - if (avcodec_open2(audio_decoder->AudioCtx, audio_codec, NULL) < 0) { - pthread_mutex_unlock(&CodecLockMutex); - Fatal(_("codec: can't open audio codec\n")); + if (1) { + AVDictionary *av_dict; + + av_dict = NULL; + // FIXME: import settings + //av_dict_set(&av_dict, "dmix_mode", "0", 0); + //av_dict_set(&av_dict, "ltrt_cmixlev", "1.414", 0); + //av_dict_set(&av_dict, "loro_cmixlev", "1.414", 0); + if (avcodec_open2(audio_decoder->AudioCtx, audio_codec, &av_dict) < 0) { + pthread_mutex_unlock(&CodecLockMutex); + Fatal(_("codec: can't open audio codec\n")); + } + av_dict_free(&av_dict); } - //av_dict_free(&av_dict); #endif pthread_mutex_unlock(&CodecLockMutex); Debug(3, "codec: audio '%s'\n", audio_decoder->AudioCtx->codec_name); @@ -712,12 +706,6 @@ void CodecAudioOpen(AudioDecoder * audio_decoder, const char *name, // we do not send complete frames audio_decoder->AudioCtx->flags |= CODEC_FLAG_TRUNCATED; } -#ifdef USE_AVPARSER - if (!(audio_decoder->AudioParser = - av_parser_init(audio_decoder->AudioCtx->codec_id))) { - Fatal(_("codec: can't init audio parser\n")); - } -#endif audio_decoder->SampleRate = 0; audio_decoder->Channels = 0; audio_decoder->HwSampleRate = 0; @@ -736,12 +724,6 @@ void CodecAudioClose(AudioDecoder * audio_decoder) audio_resample_close(audio_decoder->ReSample); audio_decoder->ReSample = NULL; } -#ifdef USE_AVPARSER - if (audio_decoder->AudioParser) { - av_parser_close(audio_decoder->AudioParser); - audio_decoder->AudioParser = NULL; - } -#endif if (audio_decoder->AudioCtx) { pthread_mutex_lock(&CodecLockMutex); avcodec_close(audio_decoder->AudioCtx); @@ -827,268 +809,6 @@ static void CodecReorderAudioFrame(int16_t * buf, int size, int channels) } } -#ifdef USE_AVPARSER - -/** -** Decode an audio packet. -** -** PTS must be handled self. -** -** @param audio_decoder audio decoder data -** @param avpkt audio packet -*/ -void CodecAudioDecodeOld(AudioDecoder * audio_decoder, const AVPacket * avpkt) -{ - int16_t buf[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 4 + - FF_INPUT_BUFFER_PADDING_SIZE] __attribute__ ((aligned(16))); - AVCodecContext *audio_ctx; - int index; - -//#define spkt avpkt -#if 1 // didn't fix crash in av_parser_parse2 - AVPacket spkt[1]; - - // av_new_packet reserves FF_INPUT_BUFFER_PADDING_SIZE and clears it - if (av_new_packet(spkt, avpkt->size)) { - Error(_("codec: out of memory\n")); - return; - } - memcpy(spkt->data, avpkt->data, avpkt->size); - spkt->pts = avpkt->pts; - spkt->dts = avpkt->dts; -#endif -#ifdef DEBUG - if (!audio_decoder->AudioParser) { - Fatal(_("codec: internal error parser freeded while running\n")); - } -#endif - - audio_ctx = audio_decoder->AudioCtx; - index = 0; - while (spkt->size > index) { - int n; - int l; - AVPacket dpkt[1]; - - av_init_packet(dpkt); - n = av_parser_parse2(audio_decoder->AudioParser, audio_ctx, - &dpkt->data, &dpkt->size, spkt->data + index, spkt->size - index, - !index ? spkt->pts : (int64_t) AV_NOPTS_VALUE, - !index ? spkt->dts : (int64_t) AV_NOPTS_VALUE, -1); - - // FIXME: make this a function for both #ifdef cases - if (dpkt->size) { - int buf_sz; - - dpkt->pts = audio_decoder->AudioParser->pts; - dpkt->dts = audio_decoder->AudioParser->dts; - buf_sz = sizeof(buf); - l = avcodec_decode_audio3(audio_ctx, buf, &buf_sz, dpkt); - if (l == AVERROR(EAGAIN)) { - index += n; // this is needed for aac latm - continue; - } - if (l < 0) { // no audio frame could be decompressed - Error(_("codec: error audio data at %d\n"), index); - break; - } -#ifdef notyetFF_API_OLD_DECODE_AUDIO - // FIXME: ffmpeg git comeing - int got_frame; - - avcodec_decode_audio4(audio_ctx, frame, &got_frame, dpkt); -#else -#endif - // Update audio clock - if (dpkt->pts != (int64_t) AV_NOPTS_VALUE) { - AudioSetClock(dpkt->pts); - } - // FIXME: must first play remainings bytes, than change and play new. - if (audio_decoder->PassthroughAC3 != CodecPassthroughAC3 - || audio_decoder->SampleRate != audio_ctx->sample_rate - || audio_decoder->Channels != audio_ctx->channels) { - int err; - int isAC3; - - audio_decoder->PassthroughAC3 = CodecPassthroughAC3; - // FIXME: use swr_convert from swresample (only in ffmpeg!) - if (audio_decoder->ReSample) { - audio_resample_close(audio_decoder->ReSample); - audio_decoder->ReSample = NULL; - } - - audio_decoder->SampleRate = audio_ctx->sample_rate; - audio_decoder->HwSampleRate = audio_ctx->sample_rate; - audio_decoder->Channels = audio_ctx->channels; - // SPDIF/HDMI passthrough - if (CodecPassthroughAC3 && audio_ctx->codec_id == CODEC_ID_AC3) { - audio_decoder->HwChannels = 2; - isAC3 = 1; - } else { - audio_decoder->HwChannels = audio_ctx->channels; - isAC3 = 0; - } - - // channels not support? - if ((err = - AudioSetup(&audio_decoder->HwSampleRate, - &audio_decoder->HwChannels, isAC3))) { - Debug(3, "codec/audio: resample %dHz *%d -> %dHz *%d\n", - audio_ctx->sample_rate, audio_ctx->channels, - audio_decoder->HwSampleRate, - audio_decoder->HwChannels); - - if (err == 1) { - audio_decoder->ReSample = - av_audio_resample_init(audio_decoder->HwChannels, - audio_ctx->channels, audio_decoder->HwSampleRate, - audio_ctx->sample_rate, audio_ctx->sample_fmt, - audio_ctx->sample_fmt, 16, 10, 0, 0.8); - // libav-0.8_pre didn't support 6 -> 2 channels - if (!audio_decoder->ReSample) { - Error(_("codec/audio: resample setup error\n")); - audio_decoder->HwChannels = 0; - audio_decoder->HwSampleRate = 0; - } - } else { - Debug(3, "codec/audio: audio setup error\n"); - // FIXME: handle errors - audio_decoder->HwChannels = 0; - audio_decoder->HwSampleRate = 0; - break; - } - } - } - - if (audio_decoder->HwSampleRate && audio_decoder->HwChannels) { - // need to resample audio - if (audio_decoder->ReSample) { - int16_t outbuf[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 4 + - FF_INPUT_BUFFER_PADDING_SIZE] - __attribute__ ((aligned(16))); - int outlen; - - // FIXME: libav-0.7.2 crash here - outlen = - audio_resample(audio_decoder->ReSample, outbuf, buf, - buf_sz); -#ifdef DEBUG - if (outlen != buf_sz) { - Debug(3, "codec/audio: possible fixed ffmpeg\n"); - } -#endif - if (outlen) { - // outlen seems to be wrong in ffmpeg-0.9 - outlen /= audio_decoder->Channels * - av_get_bytes_per_sample(audio_ctx->sample_fmt); - outlen *= - audio_decoder->HwChannels * - av_get_bytes_per_sample(audio_ctx->sample_fmt); - Debug(4, "codec/audio: %d -> %d\n", buf_sz, outlen); - CodecReorderAudioFrame(outbuf, outlen, - audio_decoder->HwChannels); - AudioEnqueue(outbuf, outlen); - } - } else { -#ifdef USE_PASSTHROUGH - // SPDIF/HDMI passthrough - if (CodecPassthroughAC3 - && audio_ctx->codec_id == CODEC_ID_AC3) { - // build SPDIF header and append A52 audio to it - // dpkt is the original data - buf_sz = 6144; - if (buf_sz < dpkt->size + 8) { - Error(_ - ("codec/audio: decoded data smaller than encoded\n")); - break; - } - // copy original data for output - // FIXME: not 100% sure, if endian is correct - buf[0] = htole16(0xF872); // iec 61937 sync word - buf[1] = htole16(0x4E1F); - buf[2] = htole16(0x01 | (dpkt->data[5] & 0x07) << 8); - buf[3] = htole16(dpkt->size * 8); - swab(dpkt->data, buf + 4, dpkt->size); - memset(buf + 4 + dpkt->size / 2, 0, - buf_sz - 8 - dpkt->size); - } -#if 0 - // - // old experimental code - // - if (1) { - // FIXME: need to detect dts - // copy original data for output - // FIXME: buf is sint - buf[0] = 0x72; - buf[1] = 0xF8; - buf[2] = 0x1F; - buf[3] = 0x4E; - buf[4] = 0x00; - switch (dpkt->size) { - case 512: - buf[5] = 0x0B; - break; - case 1024: - buf[5] = 0x0C; - break; - case 2048: - buf[5] = 0x0D; - break; - default: - Debug(3, - "codec/audio: dts sample burst not supported\n"); - buf[5] = 0x00; - break; - } - buf[6] = (dpkt->size * 8); - buf[7] = (dpkt->size * 8) >> 8; - //buf[8] = 0x0B; - //buf[9] = 0x77; - //printf("%x %x\n", dpkt->data[0],dpkt->data[1]); - // swab? - memcpy(buf + 8, dpkt->data, dpkt->size); - memset(buf + 8 + dpkt->size, 0, - buf_sz - 8 - dpkt->size); - } else if (1) { - // FIXME: need to detect mp2 - // FIXME: mp2 passthrough - // see softhddev.c version/layer - // 0x04 mpeg1 layer1 - // 0x05 mpeg1 layer23 - // 0x06 mpeg2 ext - // 0x07 mpeg2.5 layer 1 - // 0x08 mpeg2.5 layer 2 - // 0x09 mpeg2.5 layer 3 - } - // DTS HD? - // True HD? -#endif -#endif - CodecReorderAudioFrame(buf, buf_sz, - audio_decoder->HwChannels); - AudioEnqueue(buf, buf_sz); - } - } - - if (dpkt->size > l) { - Error(_("codec: error more than one frame data\n")); - } - } - - index += n; - } - -#if 1 - // or av_free_packet, make no difference here - av_destruct_packet(spkt); -#endif -} - -#else - -#endif - /** ** Decode an audio packet. ** @@ -1301,17 +1021,6 @@ void CodecAudioDecode(AudioDecoder * audio_decoder, const AVPacket * avpkt) */ void CodecAudioFlushBuffers(AudioDecoder * decoder) { -#ifdef USE_AVPARSER - // FIXME: reset audio parser - if (decoder->AudioParser) { - av_parser_close(decoder->AudioParser); - decoder->AudioParser = NULL; - if (!(decoder->AudioParser = - av_parser_init(decoder->AudioCtx->codec_id))) { - Fatal(_("codec: can't init audio parser\n")); - } - } -#endif avcodec_flush_buffers(decoder->AudioCtx); }