For those that are interested, attached is a patch that allows AC3 audio to
work in Australia. All previous problems outlined in this thread have been
resolved, some via dirty hacks.
The stuttering I was experiencing was caused by the hack to mpeg.c. The
changes in mpeg.c treat all PRIVATE_STREAM_1 packets as AC3 audio with no
header (0x80), which appears to be what oz stations are transmitting.
However, transform.c doesn't realise this and was occasionally finding
PRIVATE_STREAM_1 packets that had 0x80 or 0x20 as the first byte and adding
an extra header to them, which created an invalid AC3 packet for the hacked
mpeg.c and resulting in the stutter. I have hacked transform.c to not put the
extra headers on which fixes the stutter problem. This of course is not a
workable solution in the long term since the hack will only work in aus
presumably. Maybe someone who knows more about mpeg.c and transform.c can
look at this and see if they can work it out?
The rest of the changes should be useful to everyone, including the new GUI
option to enable AC3 audio and the audio re-initialisation code when the
audio codec changes.
Note, I have only tried this with AC3 to SPDIF, i.e. not software AC3.
Cheers,
Mark Anderson
Only in ./filters/adjust: filter_adjust.o
Only in ./filters/adjust: libadjust.so
Only in ./filters/bobdeint: filter_bobdeint.o
Only in ./filters/bobdeint: libbobdeint.so
Only in ./filters/convert: filter_convert.o
Only in ./filters/convert: libconvert.so
Only in ./filters/crop: filter_crop.o
Only in ./filters/crop: libcrop.so
Only in ./filters/denoise3d: filter_denoise3d.o
Only in ./filters/denoise3d: libdenoise3d.so
Only in ./filters/force: filter_force.o
Only in ./filters/force: libforce.so
Only in ./filters/invert: filter_invert.o
Only in ./filters/invert: libinvert.so
Only in ./filters/kerneldeint: filter_kerneldeint.o
Only in ./filters/kerneldeint: libkerneldeint.so
Only in ./filters/linearblend: filter_linearblend.o
Only in ./filters/linearblend: liblinearblend.so
Only in ./filters/onefield: filter_onefield.o
Only in ./filters/onefield: libonefield.so
Only in ./filters/postprocess: filter_postprocess.o
Only in ./filters/postprocess: libpostprocess.so
Only in ./filters/quickdnr: filter_quickdnr.o
Only in ./filters/quickdnr: libquickdnr.so
Only in ./i18n: dummy.o
Only in ./i18n: i18n
Only in ./libs/libavcodec: 4xm.o
Only in ./libs/libavcodec: 8bps.o
Only in ./libs/libavcodec: a52dec.o
Only in ./libs/libavcodec: ac3enc.o
Only in ./libs/libavcodec: adpcm.o
Only in ./libs/libavcodec: adx.o
Only in ./libs/libavcodec: allcodecs.o
Only in ./libs/libavcodec: asv1.o
Only in ./libs/libavcodec: audresample.o
Only in ./libs/libavcodec: bit_allocate.o
Only in ./libs/libavcodec: bitstream.o
Only in ./libs/libavcodec: cabac.o
Only in ./libs/libavcodec: cinepak.o
Only in ./libs/libavcodec: cljr.o
Only in ./libs/libavcodec: common.o
Only in ./libs/libavcodec: cputest.o
Only in ./libs/libavcodec: crc.o
Only in ./libs/libavcodec: cyuv.o
Only in ./libs/libavcodec: downmix.o
Only in ./libs/libavcodec: dpcm.o
Only in ./libs/libavcodec: dsputil_mmx.o
Only in ./libs/libavcodec: dsputil.o
Only in ./libs/libavcodec: dv.o
Only in ./libs/libavcodec: error_resilience.o
Only in ./libs/libavcodec: eval.o
Only in ./libs/libavcodec: faandct.o
Only in ./libs/libavcodec: fdct_mmx.o
Only in ./libs/libavcodec: fft.o
Only in ./libs/libavcodec: fft_sse.o
Only in ./libs/libavcodec: flac.o
Only in ./libs/libavcodec: flicvideo.o
Only in ./libs/libavcodec: g726.o
Only in ./libs/libavcodec: golomb.o
Only in ./libs/libavcodec: h261.o
Only in ./libs/libavcodec: h263dec.o
Only in ./libs/libavcodec: h263.o
Only in ./libs/libavcodec: h264idct.o
Only in ./libs/libavcodec: h264.o
Only in ./libs/libavcodec: huffyuv.o
Only in ./libs/libavcodec: idcinvideo.o
Only in ./libs/libavcodec: idct_mmx.o
Only in ./libs/libavcodec: imdct.o
Only in ./libs/libavcodec: imgconvert.o
Only in ./libs/libavcodec: imgresample.o
Only in ./libs/libavcodec: indeo3.o
Only in ./libs/libavcodec: integer.o
Only in ./libs/libavcodec: interplayvideo.o
Only in ./libs/libavcodec: jfdctfst.o
Only in ./libs/libavcodec: jfdctint.o
Only in ./libs/libavcodec: jrevdct.o
Only in ./libs/libavcodec: lcl.o
Only in ./libs/libavcodec: libmythavcodec-0.16.so
Only in ./libs/libavcodec: libmythavcodec-0.16.so.0
Only in ./libs/libavcodec: libmythavcodec-0.16.so.0.16
Only in ./libs/libavcodec: libmythavcodec-0.16.so.0.16.0
Only in ./libs/libavcodec: mace.o
Only in ./libs/libavcodec: mdct.o
Only in ./libs/libavcodec: mem.o
Only in ./libs/libavcodec: mjpeg.o
Only in ./libs/libavcodec: motion_est_mmx.o
Only in ./libs/libavcodec: motion_est.o
Only in ./libs/libavcodec: mpeg12.o
Only in ./libs/libavcodec: mpegaudiodec.o
Only in ./libs/libavcodec: mpegaudio.o
Only in ./libs/libavcodec: mpegvideo_mmx.o
Only in ./libs/libavcodec: mpegvideo.o
Only in ./libs/libavcodec: msmpeg4.o
Only in ./libs/libavcodec: msrle.o
Only in ./libs/libavcodec: msvideo1.o
Only in ./libs/libavcodec: opts.o
Only in ./libs/libavcodec: parse.o
Only in ./libs/libavcodec: parser.o
Only in ./libs/libavcodec: pcm.o
Only in ./libs/libavcodec: png.o
Only in ./libs/libavcodec: pnm.o
Only in ./libs/libavcodec: postprocess.o
Only in ./libs/libavcodec: qdrw.o
Only in ./libs/libavcodec: qpeg.o
Only in ./libs/libavcodec: qtrle.o
Only in ./libs/libavcodec: ra144.o
Only in ./libs/libavcodec: ra288.o
Only in ./libs/libavcodec: rangecoder.o
Only in ./libs/libavcodec: ratecontrol.o
Only in ./libs/libavcodec: rational.o
Only in ./libs/libavcodec: raw.o
Only in ./libs/libavcodec: resample2.o
Only in ./libs/libavcodec: resample.o
Only in ./libs/libavcodec: roqvideo.o
Only in ./libs/libavcodec: rpza.o
Only in ./libs/libavcodec: rv10.o
Only in ./libs/libavcodec: simple_idct_mmx.o
Only in ./libs/libavcodec: simple_idct.o
Only in ./libs/libavcodec: smc.o
Only in ./libs/libavcodec: snow.o
Only in ./libs/libavcodec: sonic.o
Only in ./libs/libavcodec: svq1.o
Only in ./libs/libavcodec: tmp
Only in ./libs/libavcodec: truemotion1.o
Only in ./libs/libavcodec: tscc.o
Only in ./libs/libavcodec: ulti.o
Only in ./libs/libavcodec: utils.o
Only in ./libs/libavcodec: vcr1.o
Only in ./libs/libavcodec: vmdav.o
Only in ./libs/libavcodec: vp3dsp_mmx.o
Only in ./libs/libavcodec: vp3dsp.o
Only in ./libs/libavcodec: vp3dsp_sse2.o
Only in ./libs/libavcodec: vp3.o
Only in ./libs/libavcodec: vqavideo.o
Only in ./libs/libavcodec: wmadec.o
Only in ./libs/libavcodec: xan.o
Only in ./libs/libavcodec: xl.o
Only in ./libs/libavcodec: xvmcvideo.o
Only in ./libs/libavformat: 4xm.o
Only in ./libs/libavformat: allformats.o
Only in ./libs/libavformat: asf-enc.o
Only in ./libs/libavformat: asf.o
Only in ./libs/libavformat: audio.o
Only in ./libs/libavformat: au.o
Only in ./libs/libavformat: avidec.o
Only in ./libs/libavformat: avienc.o
Only in ./libs/libavformat: aviobuf.o
Only in ./libs/libavformat: avio.o
Only in ./libs/libavformat: crc.o
Only in ./libs/libavformat: cutils.o
Only in ./libs/libavformat: dv.o
Only in ./libs/libavformat: electronicarts.o
Only in ./libs/libavformat: ffm.o
Only in ./libs/libavformat: file.o
Only in ./libs/libavformat: flic.o
Only in ./libs/libavformat: flvdec.o
Only in ./libs/libavformat: flvenc.o
Only in ./libs/libavformat: idcin.o
Only in ./libs/libavformat: idroq.o
Only in ./libs/libavformat: img2.o
Only in ./libs/libavformat: img.o
Only in ./libs/libavformat: ipmovie.o
Only in ./libs/libavformat: libmythavformat-0.16.so
Only in ./libs/libavformat: libmythavformat-0.16.so.0
Only in ./libs/libavformat: libmythavformat-0.16.so.0.16
Only in ./libs/libavformat: libmythavformat-0.16.so.0.16.0
Only in ./libs/libavformat: matroska.o
Only in ./libs/libavformat: movenc.o
Only in ./libs/libavformat: mov.o
Only in ./libs/libavformat: mp3.o
diff -buprB -xconfig.log -xconfig.mak -xMakefile ../mythtv-bigdvb-3.4.orig/libs/libavformat/mpeg.c ./libs/libavformat/mpeg.c
--- ../mythtv-bigdvb-3.4.orig/libs/libavformat/mpeg.c 2004-12-25 10:24:06.000000000 +1100
+++ ./libs/libavformat/mpeg.c 2005-01-08 18:00:51.776030378 +1100
@@ -1456,6 +1456,8 @@ static int mpegps_read_pes_header(AVForm
goto redo;
if (startcode == 0x1bd) {
+ startcode = 0x80;
+#if 0
if (len < 1)
goto redo;
startcode = get_byte(&s->pb);
@@ -1469,7 +1471,9 @@ static int mpegps_read_pes_header(AVForm
get_byte(&s->pb);
len -= 3;
}
+#endif
}
+
if(dts != AV_NOPTS_VALUE && ppos && s->build_index){
int i;
for(i=0; i<s->nb_streams; i++){
@@ -1530,6 +1535,10 @@ static int mpegps_read_packet(AVFormatCo
goto skip;
st->codec.codec_type = type;
st->codec.codec_id = codec_id;
+ if (s->streams_changed) {
+ s->streams_changed(s->stream_change_data);
+ }
+
if (codec_id != CODEC_ID_PCM_S16BE)
st->need_parsing = 1;
found:
Only in ./libs/libavformat: mpeg.c.working
Only in ./libs/libavformat: mpeg.o
Only in ./libs/libavformat: mpegtsenc.o
Only in ./libs/libavformat: mpegts.o
Only in ./libs/libavformat: mpjpeg.o
Only in ./libs/libavformat: nsvdec.o
Only in ./libs/libavformat: nut.o
Only in ./libs/libavformat: os_support.o
Only in ./libs/libavformat: psxstr.o
Only in ./libs/libavformat: raw.o
Only in ./libs/libavformat: rm.o
Only in ./libs/libavformat: segafilm.o
Only in ./libs/libavformat: sierravmd.o
Only in ./libs/libavformat: sol.o
Only in ./libs/libavformat: swf.o
Only in ./libs/libavformat: tmp
Only in ./libs/libavformat: utils.o
Only in ./libs/libavformat: wav.o
Only in ./libs/libavformat: wc3movie.o
Only in ./libs/libavformat: westwood.o
Only in ./libs/libavformat: yuv4mpeg.o
Only in ./libs/libmyth: audiooutputalsa.o
Only in ./libs/libmyth: audiooutputbase.o
Only in ./libs/libmyth: audiooutput.o
Only in ./libs/libmyth: audiooutputoss.o
Only in ./libs/libmyth: dbsettings.o
Only in ./libs/libmyth: dialogbox.o
Only in ./libs/libmyth: DisplayRes.o
Only in ./libs/libmyth: generictree.o
Only in ./libs/libmyth: httpcomms.o
Only in ./libs/libmyth: inetcomms.o
Only in ./libs/libmyth: jsmenuevent.o
Only in ./libs/libmyth: jsmenu.o
Only in ./libs/libmyth: lcddevice.o
Only in ./libs/libmyth: libmyth-0.16.so
Only in ./libs/libmyth: libmyth-0.16.so.0
Only in ./libs/libmyth: libmyth-0.16.so.0.16
Only in ./libs/libmyth: libmyth-0.16.so.0.16.0
Only in ./libs/libmyth: lircevent.o
Only in ./libs/libmyth: lirc.o
Only in ./libs/libmyth: managedlist.o
Only in ./libs/libmyth: moc_dialogbox.cpp
Only in ./libs/libmyth: moc_dialogbox.o
Only in ./libs/libmyth: moc_httpcomms.cpp
Only in ./libs/libmyth: moc_httpcomms.o
Only in ./libs/libmyth: moc_inetcomms.cpp
Only in ./libs/libmyth: moc_inetcomms.o
Only in ./libs/libmyth: moc_jsmenu.cpp
Only in ./libs/libmyth: moc_jsmenu.o
Only in ./libs/libmyth: moc_lcddevice.cpp
Only in ./libs/libmyth: moc_lcddevice.o
Only in ./libs/libmyth: moc_lirc.cpp
Only in ./libs/libmyth: moc_lirc.o
Only in ./libs/libmyth: moc_managedlist.cpp
Only in ./libs/libmyth: moc_managedlist.o
Only in ./libs/libmyth: moc_mythcdrom.cpp
Only in ./libs/libmyth: moc_mythcdrom.o
Only in ./libs/libmyth: moc_mythcontext.cpp
Only in ./libs/libmyth: moc_mythcontext.o
Only in ./libs/libmyth: moc_mythdialogs.cpp
Only in ./libs/libmyth: moc_mythdialogs.o
Only in ./libs/libmyth: moc_mythmedia.cpp
Only in ./libs/libmyth: moc_mythmediamonitor.cpp
Only in ./libs/libmyth: moc_mythmediamonitor.o
Only in ./libs/libmyth: moc_mythmedia.o
Only in ./libs/libmyth: moc_mythwidgets.cpp
Only in ./libs/libmyth: moc_mythwidgets.o
Only in ./libs/libmyth: moc_mythwizard.cpp
Only in ./libs/libmyth: moc_mythwizard.o
Only in ./libs/libmyth: moc_settings.cpp
Only in ./libs/libmyth: moc_settings.o
Only in ./libs/libmyth: moc_themedmenu.cpp
Only in ./libs/libmyth: moc_themedmenu.o
Only in ./libs/libmyth: moc_uilistbtntype.cpp
Only in ./libs/libmyth: moc_uilistbtntype.o
Only in ./libs/libmyth: moc_uiphoneentry.cpp
Only in ./libs/libmyth: moc_uiphoneentry.o
Only in ./libs/libmyth: moc_uitypes.cpp
Only in ./libs/libmyth: moc_uitypes.o
Only in ./libs/libmyth: mythcdrom-linux.o
Only in ./libs/libmyth: mythcdrom.o
Only in ./libs/libmyth: mythcontext.o
Only in ./libs/libmyth: mythdialogs.o
Only in ./libs/libmyth: mythmediamonitor.o
Only in ./libs/libmyth: mythmedia.o
Only in ./libs/libmyth: mythplugin.o
Only in ./libs/libmyth: mythwidgets.o
Only in ./libs/libmyth: mythwizard.o
Only in ./libs/libmyth: oldsettings.o
Only in ./libs/libmyth: remotefile.o
Only in ./libs/libmyth: screensaver-null.o
Only in ./libs/libmyth: screensaver.o
Only in ./libs/libmyth: screensaver-x11.o
Only in ./libs/libmyth: settings.o
Only in ./libs/libmyth: themedmenu.o
Only in ./libs/libmyth: uilistbtntype.o
Only in ./libs/libmyth: uiphoneentry.o
Only in ./libs/libmyth: uitypes.o
Only in ./libs/libmyth: util.o
Only in ./libs/libmyth: volumebase.o
Only in ./libs/libmyth: volumecontrol.o
Only in ./libs/libmyth: xmlparse.o
Only in ./libs/libmythsamplerate: libmythsamplerate-0.16.a
Only in ./libs/libmythsamplerate: samplerate.o
Only in ./libs/libmythsamplerate: src_linear.o
Only in ./libs/libmythsamplerate: src_sinc.o
Only in ./libs/libmythsamplerate: src_zoh.o
Only in ./libs/libmythsoundtouch: AAFilter.o
Only in ./libs/libmythsoundtouch: cpu_detect_x86_gcc.o
Only in ./libs/libmythsoundtouch: FIFOSampleBuffer.o
Only in ./libs/libmythsoundtouch: FIRFilter.o
Only in ./libs/libmythsoundtouch: libmythsoundtouch-0.16.a
Only in ./libs/libmythsoundtouch: mmx_gcc.o
Only in ./libs/libmythsoundtouch: RateTransposer.o
Only in ./libs/libmythsoundtouch: SoundTouch.o
Only in ./libs/libmythsoundtouch: TDStretch.o
Only in ./libs/libmythtv: atscdescriptorsmap.o
Only in ./libs/libmythtv: atscdescriptors.o
Only in ./libs/libmythtv: atscstreamdata.o
Only in ./libs/libmythtv: atsctables.o
diff -buprB -xconfig.log -xconfig.mak -xMakefile ../mythtv-bigdvb-3.4.orig/libs/libmythtv/avformatdecoder.cpp ./libs/libmythtv/avformatdecoder.cpp
--- ../mythtv-bigdvb-3.4.orig/libs/libmythtv/avformatdecoder.cpp 2004-12-25 10:24:07.000000000 +1100
+++ ./libs/libmythtv/avformatdecoder.cpp 2005-01-08 18:02:40.600007312 +1100
@@ -39,6 +39,7 @@ AvFormatDecoder::AvFormatDecoder(NuppelV
audio_channels = -1;
audio_sample_size = -1;
audio_sampling_rate = -1;
+ audio_codec = -1;
hasbframes = false;
@@ -491,7 +492,6 @@ int AvFormatDecoder::ScanStreams(bool no
case CODEC_TYPE_AUDIO:
{
assert(enc->codec_id);
- enc->channels = 2;
bitrate += enc->bit_rate;
break;
}
@@ -517,11 +517,11 @@ int AvFormatDecoder::ScanStreams(bool no
AVCodec *codec = avcodec_find_decoder(enc->codec_id);
if (!codec)
{
- VERBOSE(VB_IMPORTANT, QString("AvFormatDecoder: Could not find decoder for codec (%1) aborting.")
+ VERBOSE(VB_IMPORTANT, QString("AvFormatDecoder: Could not find decoder for codec (%1) ignoring.")
.arg(enc->codec_id));
- av_close_input_file(ic);
- ic = NULL;
- scanerror = -1;
+ //av_close_input_file(ic);
+ //ic = NULL;
+ //scanerror = -1;
continue;
}
@@ -537,7 +537,7 @@ int AvFormatDecoder::ScanStreams(bool no
av_close_input_file(ic);
ic = NULL;
scanerror = -1;
- continue;
+ break;
}
if (enc->codec_type == CODEC_TYPE_AUDIO)
@@ -585,8 +584,9 @@ bool AvFormatDecoder::CheckVideoParams(i
return true;
}
-void AvFormatDecoder::CheckAudioParams(int freq, int channels, bool safe)
+void AvFormatDecoder::CheckAudioParams(int freq, int channels, int codec_id, bool safe)
{
+
if (freq <= 0 || channels <= 0)
return;
@@ -592,18 +592,20 @@ void AvFormatDecoder::CheckAudioParams(i
if (safe || audio_check_1st == 2)
{
- if (freq == audio_sampling_rate && channels == audio_channels)
+ if (freq == audio_sampling_rate && channels == audio_channels && audio_codec == codec_id)
return;
audio_check_1st = 1;
audio_sampling_rate_2nd = freq;
audio_channels_2nd = channels;
+ audio_codec_2nd = codec_id;
if (safe == false)
return;
}
else
{
if (freq != audio_sampling_rate_2nd || channels != audio_channels_2nd ||
- (freq == audio_sampling_rate && channels == audio_channels))
+ codec_id != audio_codec_2nd ||
+ (freq == audio_sampling_rate && channels == audio_channels && codec_id == audio_codec))
{
audio_sampling_rate_2nd = -1;
audio_channels_2nd = -1;
@@ -619,11 +621,11 @@ void AvFormatDecoder::CheckAudioParams(i
}
audio_check_1st = 2;
-
if (audio_channels != -1)
- VERBOSE(VB_AUDIO, QString("Audio format changed from %1 channels,"
- " %2hz to %3 channels %4hz").arg(audio_channels)
- .arg(audio_sampling_rate).arg(channels).arg(freq));
+ VERBOSE(VB_ALL, QString("Audio format changed from %1 channels,"
+ " %2hz codec %3 to %4 channels %5hz codec %6").arg(audio_channels)
+ .arg(audio_sampling_rate).arg(audio_codec).arg(channels)
+ .arg(freq).arg(codec_id));
AVCodecContext *enc = &ic->streams[wantedAudioStream]->codec;
AVCodec *codec = enc->codec;
@@ -1000,7 +1002,7 @@ void AvFormatDecoder::incCurrentAudioTra
wantedAudioStream = audioStreams[currentAudioTrack];
AVCodecContext *e = &ic->streams[wantedAudioStream]->codec;
- CheckAudioParams(e->sample_rate, e->channels, true);
+ CheckAudioParams(e->sample_rate, e->channels, e->codec_id, true);
}
}
@@ -1017,7 +1019,7 @@ void AvFormatDecoder::decCurrentAudioTra
wantedAudioStream = audioStreams[currentAudioTrack];
AVCodecContext *e = &ic->streams[wantedAudioStream]->codec;
- CheckAudioParams(e->sample_rate, e->channels, true);
+ CheckAudioParams(e->sample_rate, e->channels, e->codec_id, true);
}
}
@@ -1035,22 +1037,26 @@ bool AvFormatDecoder::setCurrentAudioTra
wantedAudioStream = audioStreams[currentAudioTrack];
AVCodecContext *e = &ic->streams[wantedAudioStream]->codec;
- CheckAudioParams(e->sample_rate, e->channels, true);
+ CheckAudioParams(e->sample_rate, e->channels, e->codec_id, true);
return true;
}
-bool AvFormatDecoder::autoSelectAudioTrack()
+bool AvFormatDecoder::autoSelectAudioTrack(bool wantac3)
{
if (!audioStreams.size())
return false;
+ if (wantac3)
+ {
+ wantac3 = gContext->GetNumSetting("WantAC3", false);
+ }
+
bool foundAudio = false;
int minChannels = 1;
int maxTracks = (audioStreams.size() - 1);
int track;
- if (do_ac3_passthru)
+ if (wantac3)
minChannels = 2;
-
while (!foundAudio)
{
for (track = maxTracks; track >= 0; track--)
@@ -1057,7 +1063,11 @@ bool AvFormatDecoder::autoSelectAudioTra
{
int tempStream = audioStreams[track];
AVCodecContext *e = &ic->streams[tempStream]->codec;
-
+ if (((wantac3) && (e->codec_id != CODEC_ID_AC3)) ||
+ ((!wantac3) && (e->codec_id == CODEC_ID_AC3)))
+ {
+ continue;
+ }
if (e->channels > minChannels)
{
currentAudioTrack = track;
@@ -1066,16 +1076,25 @@ bool AvFormatDecoder::autoSelectAudioTra
.arg(track + 1).arg(tempStream));
VERBOSE(VB_AUDIO, QString("It has %1 channels and we needed at least %2")
.arg(e->channels).arg(minChannels + 1));
-
+ if (wantac3)
+ {
+ VERBOSE(VB_ALL, QString("AC3 stream has been selected"));
+ }
AVCodecContext *e = &ic->streams[wantedAudioStream]->codec;
- CheckAudioParams(e->sample_rate, e->channels, true);
+ CheckAudioParams(e->sample_rate, e->channels, e->codec_id, true);
return true;
}
}
minChannels--;
if (minChannels < 0)
+ {
+ if (wantac3)
+ {
+ return autoSelectAudioTrack(false);
+ }
return false;
}
+ }
return false;
}
@@ -1092,6 +1111,8 @@ void AvFormatDecoder::SetupAudioStream(v
VERBOSE(VB_ALL, QString("Initializing audio parms from stream #%1.")
.arg(currentAudioTrack));
+ audio_codec = curstream->codec.codec_id;
+
m_parent->SetEffDsp(curstream->codec.sample_rate * 100);
do_ac3_passthru = curstream->codec.codec_id == CODEC_ID_AC3 &&
@@ -1099,6 +1120,7 @@ void AvFormatDecoder::SetupAudioStream(v
if (do_ac3_passthru)
{
+ VERBOSE(VB_ALL, QString("AC3 passthrough is enabled"));
// An AC3 stream looks like a 48KHz 2ch audio stream to
// the sound card
audio_sample_size = 4;
@@ -1137,6 +1158,7 @@ bool AvFormatDecoder::GetFrame(int onlyv
while (!allowedquit)
{
+
if (gotvideo)
{
if (lowbuffers && onlyvideo == 0 && lastapts < lastvpts + 100 &&
@@ -1248,9 +1269,14 @@ bool AvFormatDecoder::GetFrame(int onlyv
{
case CODEC_TYPE_AUDIO:
{
+ //hmm the codec has changed from what we were initialised with
+ //move to the next stream to see if it is correct
+ if (curstream->codec.codec_id != audio_codec)
+ {
+ incCurrentAudioTrack();
+ }
if (firstloop && pkt->pts != (int64_t)AV_NOPTS_VALUE)
lastapts = pkt->pts / (AV_TIME_BASE / 1000);
-
if (onlyvideo != 0 ||
(pkt->stream_index != wantedAudioStream))
{
@@ -1280,7 +1305,9 @@ bool AvFormatDecoder::GetFrame(int onlyv
if (!do_ac3_passthru)
CheckAudioParams(curstream->codec.sample_rate,
- curstream->codec.channels, false);
+ curstream->codec.channels,
+ curstream->codec.codec_id,
+ false);
long long temppts = lastapts;
Only in ./libs/libmythtv: avformatdecoder.cpp.orig
diff -buprB -xconfig.log -xconfig.mak -xMakefile ../mythtv-bigdvb-3.4.orig/libs/libmythtv/avformatdecoder.h ./libs/libmythtv/avformatdecoder.h
--- ../mythtv-bigdvb-3.4.orig/libs/libmythtv/avformatdecoder.h 2004-12-08 15:23:16.000000000 +1100
+++ ./libs/libmythtv/avformatdecoder.h 2005-01-07 19:54:24.000000000 +1100
@@ -78,7 +78,7 @@ class AvFormatDecoder : public DecoderBa
/// Attempt to find the optimal audio stream to use based on the number of channels,
/// and if we're doing AC3 passthrough. This will select the highest stream number
/// that matches our criteria.
- bool autoSelectAudioTrack();
+ bool autoSelectAudioTrack(bool wantac3 = true);
RingBuffer *getRingBuf(void) { return ringBuffer; }
@@ -112,7 +112,7 @@ class AvFormatDecoder : public DecoderBa
bool CheckVideoParams(int width, int height);
/// See if the audio parameters have changed, return true if so.
- void CheckAudioParams(int freq, int channels, bool safe);
+ void CheckAudioParams(int freq, int channels, int codec, bool safe);
void SetupAudioStream(void);
int EncodeAC3Frame(unsigned char* data, int len, short *samples,
@@ -134,10 +134,13 @@ class AvFormatDecoder : public DecoderBa
int audio_sample_size;
int audio_sampling_rate;
int audio_channels;
+ int audio_codec;
int audio_check_1st; ///< Used by CheckAudioParams
int audio_sampling_rate_2nd; ///< Used by CheckAudioParams
int audio_channels_2nd; ///< Used by CheckAudioParams
+ int audio_codec_2nd; ///< Used by CheckAudioParams
+
bool hasbframes; ///< Set in open but not used.
Only in ./libs/libmythtv: avformatdecoder.h.orig
Only in ./libs/libmythtv: avformatdecoder.o
Only in ./libs/libmythtv: blend.o
Only in ./libs/libmythtv: cc.o
Only in ./libs/libmythtv: channelbase.o
Only in ./libs/libmythtv: channeleditor.o
Only in ./libs/libmythtv: channel.o
Only in ./libs/libmythtv: channelsettings.o
Only in ./libs/libmythtv: commercial_skip.o
Only in ./libs/libmythtv: datadirect.o
Only in ./libs/libmythtv: dbcheck.o
Only in ./libs/libmythtv: decoderbase.o
Only in ./libs/libmythtv: dtvrecorder.o
Only in ./libs/libmythtv: dvbcam.o
Only in ./libs/libmythtv: dvbchannel.o
Only in ./libs/libmythtv: dvbci.o
Only in ./libs/libmythtv/dvbdev: tmp
diff -buprB -xconfig.log -xconfig.mak -xMakefile ../mythtv-bigdvb-3.4.orig/libs/libmythtv/dvbdev/transform.c ./libs/libmythtv/dvbdev/transform.c
--- ../mythtv-bigdvb-3.4.orig/libs/libmythtv/dvbdev/transform.c 2005-01-07 20:50:05.000000000 +1100
+++ ./libs/libmythtv/dvbdev/transform.c 2005-01-08 18:06:10.507280136 +1100
@@ -643,6 +643,7 @@ void send_ipack(ipack *p)
switch (streamid & 0xF8){
case 0x80:
+#if 0
ai.off = 0;
ac3_off = ((p->buf[off+2] << 8)| p->buf[off+3]);
if (ac3_off < p->count)
@@ -657,6 +658,7 @@ void send_ipack(ipack *p)
ac3_off += nframes * ai.framesize - p->count;
}
+#endif
break;
case 0x20:
@@ -682,17 +684,20 @@ void send_ipack(ipack *p)
switch (streamid & 0xF8){
case 0x80:
+#if 0
p->count += 4;
p->buf[9] = streamid;
p->buf[10] = 0;
p->buf[11] = (ac3_off >> 8)& 0xFF;
p->buf[12] = (ac3_off)& 0xFF;
break;
-
+#endif
case 0x20:
+#if 0
p->count += 2;
p->buf[9] = 0x20;
p->buf[10] = 0;
+#endif
break;
}
}
Only in ./libs/libmythtv/dvbdev: transform.c.working
Only in ./libs/libmythtv: dvbdev.o
Only in ./libs/libmythtv: dvbdiseqc.o
diff -buprB -xconfig.log -xconfig.mak -xMakefile ../mythtv-bigdvb-3.4.orig/libs/libmythtv/dvbrecorder.cpp ./libs/libmythtv/dvbrecorder.cpp
--- ../mythtv-bigdvb-3.4.orig/libs/libmythtv/dvbrecorder.cpp 2005-01-07 20:50:05.000000000 +1100
+++ ./libs/libmythtv/dvbrecorder.cpp 2005-01-08 14:38:17.000000000 +1100
@@ -48,6 +48,7 @@ using namespace std;
#include "RingBuffer.h"
#include "programinfo.h"
+#include "mythcontext.h"
#include "transform.h"
#include "dvbtypes.h"
@@ -296,7 +297,7 @@ void DVBRecorder::SetDemuxFilters(PMTObj
*/
// Myth currently only supports one video and one audio PID
- ElementaryPIDObject as = pmt.PreferredAudioStream();
+ ElementaryPIDObject as = pmt.PreferredAudioStream(gContext->GetNumSetting("WantAC3", false));
ElementaryPIDObject vs = pmt.PreferredVideoStream();
ElementaryPIDObject sub = pmt.PreferredSubtitleStream();
vpid = vs.PID;
@@ -517,7 +518,7 @@ void DVBRecorder::ReadFromDMX()
}
}
-// DebugTSHeader(&pktbuf[0],readsz);
+ //DebugTSHeader(&pktbuf[0],readsz);
if (_record_transport_stream_option)
{
Only in ./libs/libmythtv: dvbrecorder.o
Only in ./libs/libmythtv: dvbsignalmonitor.o
Only in ./libs/libmythtv: dvbsiparser.o
Only in ./libs/libmythtv: dvbtransporteditor.o
Only in ./libs/libmythtv: fifowriter.o
Only in ./libs/libmythtv: filtermanager.o
Only in ./libs/libmythtv: frequencies.o
Only in ./libs/libmythtv: guidegrid.o
Only in ./libs/libmythtv: hamm.o
Only in ./libs/libmythtv: hdtvrecorder.o
Only in ./libs/libmythtv: infostructs.o
Only in ./libs/libmythtv: ivtvdecoder.o
Only in ./libs/libmythtv: jitterometer.o
Only in ./libs/libmythtv: jobqueue.o
Only in ./libs/libmythtv: lang.o
Only in ./libs/libmythtv: libmythtv-0.16.so
Only in ./libs/libmythtv: libmythtv-0.16.so.0
Only in ./libs/libmythtv: libmythtv-0.16.so.0.16
Only in ./libs/libmythtv: libmythtv-0.16.so.0.16.0
Only in ./libs/libmythtv: minilzo.o
Only in ./libs/libmythtv: moc_channeleditor.cpp
Only in ./libs/libmythtv: moc_channeleditor.o
Only in ./libs/libmythtv: moc_channelsettings.cpp
Only in ./libs/libmythtv: moc_channelsettings.o
Only in ./libs/libmythtv: moc_dvbcam.cpp
Only in ./libs/libmythtv: moc_dvbcam.o
Only in ./libs/libmythtv: moc_dvbchannel.cpp
Only in ./libs/libmythtv: moc_dvbchannel.o
Only in ./libs/libmythtv: moc_dvbrecorder.cpp
Only in ./libs/libmythtv: moc_dvbrecorder.o
Only in ./libs/libmythtv: moc_dvbsignalmonitor.cpp
Only in ./libs/libmythtv: moc_dvbsignalmonitor.o
Only in ./libs/libmythtv: moc_dvbtransporteditor.cpp
Only in ./libs/libmythtv: moc_dvbtransporteditor.o
Only in ./libs/libmythtv: moc_guidegrid.cpp
Only in ./libs/libmythtv: moc_guidegrid.o
Only in ./libs/libmythtv: moc_osd.cpp
Only in ./libs/libmythtv: moc_osdlistbtntype.cpp
Only in ./libs/libmythtv: moc_osdlistbtntype.o
Only in ./libs/libmythtv: moc_osd.o
Only in ./libs/libmythtv: moc_osdtypes.cpp
Only in ./libs/libmythtv: moc_osdtypes.o
Only in ./libs/libmythtv: moc_profilegroup.cpp
Only in ./libs/libmythtv: moc_profilegroup.o
Only in ./libs/libmythtv: moc_progfind.cpp
Only in ./libs/libmythtv: moc_progfind.o
Only in ./libs/libmythtv: moc_proglist.cpp
Only in ./libs/libmythtv: moc_proglist.o
Only in ./libs/libmythtv: moc_recordingprofile.cpp
Only in ./libs/libmythtv: moc_recordingprofile.o
Only in ./libs/libmythtv: moc_scanwizard.cpp
Only in ./libs/libmythtv: moc_scanwizard.o
Only in ./libs/libmythtv: moc_scheduledrecording.cpp
Only in ./libs/libmythtv: moc_scheduledrecording.o
Only in ./libs/libmythtv: moc_siparser.cpp
Only in ./libs/libmythtv: moc_siparser.o
Only in ./libs/libmythtv: moc_siscan.cpp
Only in ./libs/libmythtv: moc_siscan.o
Only in ./libs/libmythtv: moc_sr_dialog.cpp
Only in ./libs/libmythtv: moc_sr_dialog.o
Only in ./libs/libmythtv: moc_sr_items.cpp
Only in ./libs/libmythtv: moc_sr_items.o
Only in ./libs/libmythtv: moc_sr_root.cpp
Only in ./libs/libmythtv: moc_sr_root.o
Only in ./libs/libmythtv: moc_tv_play.cpp
Only in ./libs/libmythtv: moc_tv_play.o
Only in ./libs/libmythtv: moc_udpnotify.cpp
Only in ./libs/libmythtv: moc_udpnotify.o
Only in ./libs/libmythtv: moc_videosource.cpp
Only in ./libs/libmythtv: moc_videosource.o
Only in ./libs/libmythtv: moc_xbox.cpp
Only in ./libs/libmythtv: moc_xbox.o
Only in ./libs/libmythtv: mpegrecorder.o
Only in ./libs/libmythtv: mpegstreamdata.o
Only in ./libs/libmythtv: mpegtables.o
Only in ./libs/libmythtv: nuppeldecoder.o
Only in ./libs/libmythtv: NuppelVideoPlayer.o
Only in ./libs/libmythtv: NuppelVideoRecorder.o
Only in ./libs/libmythtv: osdlistbtntype.o
Only in ./libs/libmythtv: osd.o
Only in ./libs/libmythtv: osdsurface.o
Only in ./libs/libmythtv: osdtypes.o
Only in ./libs/libmythtv: pespacket.o
Only in ./libs/libmythtv: profilegroup.o
Only in ./libs/libmythtv: progfind.o
Only in ./libs/libmythtv: proglist.o
Only in ./libs/libmythtv: programinfo.o
Only in ./libs/libmythtv: recorderbase.o
Only in ./libs/libmythtv: recordingprofile.o
Only in ./libs/libmythtv: recordingtypes.o
Only in ./libs/libmythtv: remoteencoder.o
Only in ./libs/libmythtv: remoteutil.o
Only in ./libs/libmythtv: RingBuffer.o
Only in ./libs/libmythtv: ringbuffy.o
Only in ./libs/libmythtv: RTjpegN.o
Only in ./libs/libmythtv: scanwizard.o
Only in ./libs/libmythtv: scheduledrecording.o
Only in ./libs/libmythtv: siparser.o
Only in ./libs/libmythtv: siscan.o
diff -buprB -xconfig.log -xconfig.mak -xMakefile ../mythtv-bigdvb-3.4.orig/libs/libmythtv/sitypes.h ./libs/libmythtv/sitypes.h
--- ../mythtv-bigdvb-3.4.orig/libs/libmythtv/sitypes.h 2004-12-23 23:04:22.000000000 +1100
+++ ./libs/libmythtv/sitypes.h 2005-01-07 18:37:23.000000000 +1100
@@ -507,10 +507,18 @@ class PMTObject
// Try to auto detect which audio stream to use
// (Can go away when we can record them all)
- ElementaryPIDObject PreferredAudioStream()
+ ElementaryPIDObject PreferredAudioStream(bool wantAC3 = false)
{
- // Use first stream with recording flag set
+ //search ac3 first
QValueList<ElementaryPIDObject>::Iterator pit;
+ if (wantAC3)
+ {
+ for (pit = Components.begin(); pit != Components.end(); ++pit)
+ if (((*pit).Type == ES_TYPE_AUDIO_AC3) && (*pit).Record)
+ return *pit;
+ }
+
+ // Use first stream with recording flag set
for (pit = Components.begin(); pit != Components.end(); ++pit)
if (((*pit).Type == ES_TYPE_AUDIO_PCM) && (*pit).Record)
return *pit;
Only in ./libs/libmythtv: sr_dialog.o
Only in ./libs/libmythtv: sr_items.o
Only in ./libs/libmythtv: sr_root.o
Only in ./libs/libmythtv: tmp
Only in ./libs/libmythtv: transform.o
Only in ./libs/libmythtv: tspacket.o
Only in ./libs/libmythtv: ttfont.o
Only in ./libs/libmythtv: tv_play.o
Only in ./libs/libmythtv: tv_rec.o
Only in ./libs/libmythtv: udpnotify.o
Only in ./libs/libmythtv: vbi.o
Only in ./libs/libmythtv: videooutbase.o
Only in ./libs/libmythtv: videoout_ivtv.o
Only in ./libs/libmythtv: videoout_null.o
Only in ./libs/libmythtv: videoout_xvmc.o
Only in ./libs/libmythtv: videoout_xv.o
Only in ./libs/libmythtv: videosource.o
Only in ./libs/libmythtv: vsync.o
Only in ./libs/libmythtv: xbox.o
Only in ./libs/libmythtv: XvMCSurfaceTypes.o
Only in ./libs/libmythtv: yuv2rgb.o
Only in ../mythtv-bigdvb-3.4.orig/: mythtv
Only in ./: oz-ac3-bigdvb3.4.diff
Only in ./: oz-ac3-bigdvb3.4-v2.diff
Only in ./programs/mythbackend: autoexpire.o
Only in ./programs/mythbackend: encoderlink.o
Only in ./programs/mythbackend: filetransfer.o
Only in ./programs/mythbackend: housekeeper.o
Only in ./programs/mythbackend: httpstatus.o
Only in ./programs/mythbackend: main.o
Only in ./programs/mythbackend: mainserver.o
Only in ./programs/mythbackend: moc_httpstatus.cpp
Only in ./programs/mythbackend: moc_httpstatus.o
Only in ./programs/mythbackend: moc_mainserver.cpp
Only in ./programs/mythbackend: moc_mainserver.o
Only in ./programs/mythbackend: moc_server.cpp
Only in ./programs/mythbackend: moc_server.o
Only in ./programs/mythbackend: mythbackend
Only in ./programs/mythbackend: playbacksock.o
Only in ./programs/mythbackend: scheduler.o
Only in ./programs/mythbackend: server.o
Only in ./programs/mythcommflag: main.o
Only in ./programs/mythcommflag: mythcommflag
Only in ./programs/mythepg: main.o
Only in ./programs/mythepg: mythepg
Only in ./programs/mythfilldatabase: filldata.o
Only in ./programs/mythfilldatabase: mythfilldatabase
Only in ./programs/mythfrontend: channelrecpriority.o
Only in ./programs/mythfrontend: customrecord.o
diff -buprB -xconfig.log -xconfig.mak -xMakefile ../mythtv-bigdvb-3.4.orig/programs/mythfrontend/globalsettings.cpp ./programs/mythfrontend/globalsettings.cpp
--- ../mythtv-bigdvb-3.4.orig/programs/mythfrontend/globalsettings.cpp 2004-12-20 05:26:28.000000000 +1100
+++ ./programs/mythfrontend/globalsettings.cpp 2005-01-07 18:01:30.000000000 +1100
@@ -184,6 +184,17 @@ static GenericCheckBox *IndividualMuteCo
return gc;
}
+static GenericCheckBox *WantAC3()
+{
+ GenericCheckBox *gc = new GenericCheckBox("WantAC3");
+ gc->setLabel(QObject::tr("Use Dolby digital audio where available"));
+ gc->setValue(false);
+ gc->setHelpText(QObject::tr("Where a Dolby digital sound track is "
+ "available (usually digital TV) use it. If this is not"
+ " set then Dolby audio will be disabled"));
+ return gc;
+}
+
static GenericCheckBox *AC3PassThrough()
{
GenericCheckBox *gc = new GenericCheckBox("AC3PassThru");
@@ -1880,6 +1891,7 @@ public:
setUseLabel(false);
addChild(AudioOutputDevice());
+ addChild(WantAC3());
addChild(AC3PassThrough());
addChild(AggressiveBuffer());
Only in ./programs/mythfrontend: globalsettings.o
Only in ./programs/mythfrontend: main.o
Only in ./programs/mythfrontend: manualbox.o
Only in ./programs/mythfrontend: manualschedule.o
Only in ./programs/mythfrontend: moc_channelrecpriority.cpp
Only in ./programs/mythfrontend: moc_channelrecpriority.o
Only in ./programs/mythfrontend: moc_customrecord.cpp
Only in ./programs/mythfrontend: moc_customrecord.o
Only in ./programs/mythfrontend: moc_manualbox.cpp
Only in ./programs/mythfrontend: moc_manualbox.o
Only in ./programs/mythfrontend: moc_manualschedule.cpp
Only in ./programs/mythfrontend: moc_manualschedule.o
Only in ./programs/mythfrontend: moc_playbackbox.cpp
Only in ./programs/mythfrontend: moc_playbackbox.o
Only in ./programs/mythfrontend: moc_previousbox.cpp
Only in ./programs/mythfrontend: moc_previousbox.o
Only in ./programs/mythfrontend: moc_programrecpriority.cpp
Only in ./programs/mythfrontend: moc_programrecpriority.o
Only in ./programs/mythfrontend: moc_statusbox.cpp
Only in ./programs/mythfrontend: moc_statusbox.o
Only in ./programs/mythfrontend: moc_viewscheduled.cpp
Only in ./programs/mythfrontend: moc_viewscheduled.o
Only in ./programs/mythfrontend: mythfrontend
Only in ./programs/mythfrontend: playbackbox.o
Only in ./programs/mythfrontend: previousbox.o
Only in ./programs/mythfrontend: programrecpriority.o
Only in ./programs/mythfrontend: statusbox.o
Only in ./programs/mythfrontend: viewscheduled.o
Only in ./programs/mythjobqueue: main.o
Only in ./programs/mythjobqueue: mythjobqueue
Only in ./programs/mythlcd: main.o
Only in ./programs/mythlcd: moc_mythlcd.cpp
Only in ./programs/mythlcd: moc_mythlcd.o
Only in ./programs/mythlcd: mythlcd
Only in ./programs/mythlcd: mythlcd.o
Only in ./programs/mythprogfind: main.o
Only in ./programs/mythprogfind: mythprogfind
Only in ./programs/mythtranscode: main.o
Only in ./programs/mythtranscode: mpeg2trans.o
Only in ./programs/mythtranscode: mythtranscode
Only in ./programs/mythtranscode: transcode.o
Only in ./programs/mythtv: main.o
Only in ./programs/mythtv: mythtv
Only in ./programs/mythtvosd: main.o
Only in ./programs/mythtvosd: mythtvosd
Only in ./setup: backendsettings.o
Only in ./setup: main.o
Only in ./setup: setup
Only in ./: setxmltvid.sql
Only in ./themes: dummy.o
Only in ./themes: themes
_______________________________________________
mythtv-dev mailing list
[email protected]
http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-dev