The attached patch should allow AC3 audio to kinda work with big dvb 3.4 in 
Australia. It still stutters regularly, but you can switch between stream 
types properly and even enable AC3 through the gui.

Note 1: There is also a hacked fix for a floating point exception (div by 0) I 
was getting on HD channels.
Note 2: To enable AC3 audio you must set the "Use Dolby digital audio where 
available" checkbox in the general settings page (next to Enable AC3 
passthrough). 

Let me know how it goes.

Cheers,
Mark Anderson


 

diff -buprB ../mythtv-bigdvb-3.4.orig/config.log ./config.log
--- ../mythtv-bigdvb-3.4.orig/config.log	2005-01-07 20:52:35.357549203 +1100
+++ ./config.log	2005-01-06 18:19:31.000000000 +1100
@@ -1,2 +1,2 @@
-Fri Jan  7 20:52:35 EST 2005
+Thu Jan  6 18:19:31 EST 2005
    ./configure  
diff -buprB ../mythtv-bigdvb-3.4.orig/config.mak ./config.mak
--- ../mythtv-bigdvb-3.4.orig/config.mak	2005-01-07 20:52:35.373546398 +1100
+++ ./config.mak	2005-01-06 18:19:31.000000000 +1100
@@ -15,4 +15,4 @@ CONFIG_NETWORK=yes
 CONFIG_ZLIB=yes
 CONFIG_RISKY=yes
 CONFIG_GPL=yes
-SRC_PATH=/home/mythtv/mythtv-cvs/mythtv-bigdvb-3.4.orig
+SRC_PATH=/home/mythtv/mythtv-cvs/mythtv-bigdvb-3.4
Only in ./filters/adjust: filter_adjust.o
Only in ./filters/adjust: libadjust.so
Only in ./filters/adjust: Makefile
Only in ./filters/bobdeint: filter_bobdeint.o
Only in ./filters/bobdeint: libbobdeint.so
Only in ./filters/bobdeint: Makefile
Only in ./filters/convert: filter_convert.o
Only in ./filters/convert: libconvert.so
Only in ./filters/convert: Makefile
Only in ./filters/crop: filter_crop.o
Only in ./filters/crop: libcrop.so
Only in ./filters/crop: Makefile
Only in ./filters/denoise3d: filter_denoise3d.o
Only in ./filters/denoise3d: libdenoise3d.so
Only in ./filters/denoise3d: Makefile
Only in ./filters/force: filter_force.o
Only in ./filters/force: libforce.so
Only in ./filters/force: Makefile
Only in ./filters/invert: filter_invert.o
Only in ./filters/invert: libinvert.so
Only in ./filters/invert: Makefile
Only in ./filters/kerneldeint: filter_kerneldeint.o
Only in ./filters/kerneldeint: libkerneldeint.so
Only in ./filters/kerneldeint: Makefile
Only in ./filters/linearblend: filter_linearblend.o
Only in ./filters/linearblend: liblinearblend.so
Only in ./filters/linearblend: Makefile
Only in ./filters: Makefile
Only in ./filters/onefield: filter_onefield.o
Only in ./filters/onefield: libonefield.so
Only in ./filters/onefield: Makefile
Only in ./filters/postprocess: filter_postprocess.o
Only in ./filters/postprocess: libpostprocess.so
Only in ./filters/postprocess: Makefile
Only in ./filters/quickdnr: filter_quickdnr.o
Only in ./filters/quickdnr: libquickdnr.so
Only in ./filters/quickdnr: Makefile
Only in ./i18n: dummy.o
Only in ./i18n: i18n
Only in ./i18n: Makefile
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: Makefile
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: Makefile
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 ../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-07 20:39:51.194533920 +1100
@@ -1455,13 +1455,13 @@ static int mpegps_read_pes_header(AVForm
     else if( c!= 0xf )
         goto redo;
 
-    if (startcode == 0x1bd) {
+/*    if (startcode == 0x1bd) {
         if (len < 1)
             goto redo;
         startcode = get_byte(&s->pb);
         len--;
         if (startcode >= 0x80 && startcode <= 0xbf) {
-            /* audio: skip header */
+            // audio: skip header 
             if (len < 3)
                 goto redo;
             get_byte(&s->pb);
@@ -1470,6 +1470,7 @@ static int mpegps_read_pes_header(AVForm
             len -= 3;
         }
     }
+*/
     if(dts != AV_NOPTS_VALUE && ppos && s->build_index){
         int i;
         for(i=0; i<s->nb_streams; i++){
@@ -1509,9 +1510,13 @@ static int mpegps_read_packet(AVFormatCo
     } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
         type = CODEC_TYPE_AUDIO;
         codec_id = CODEC_ID_MP2;
-    } else if (startcode >= 0x80 && startcode <= 0x89) {
+/*    } else if (startcode >= 0x80 && startcode <= 0x89) {
+        type = CODEC_TYPE_AUDIO;
+        codec_id = CODEC_ID_AC3;*/
+    } else if (startcode >= 0x1b0 && startcode <= 0x1bf) {
         type = CODEC_TYPE_AUDIO;
         codec_id = CODEC_ID_AC3;
+
     } else if (startcode >= 0x8a && startcode <= 0x9f) {
         type = CODEC_TYPE_AUDIO;
         codec_id = CODEC_ID_DTS;
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: Makefile
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: Makefile
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: Makefile
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 ../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-07 21:07:04.862213665 +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;
@@ -1000,7 +1001,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 +1018,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 +1036,24 @@ 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--)
@@ -1055,9 +1058,14 @@ bool AvFormatDecoder::autoSelectAudioTra
     {
         for (track = maxTracks; track >= 0; track--)
         {
+
             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 +1074,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 +1109,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 +1118,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 +1156,7 @@ bool AvFormatDecoder::GetFrame(int onlyv
 
     while (!allowedquit)
     {
+	
         if (gotvideo)
         {
             if (lowbuffers && onlyvideo == 0 && lastapts < lastvpts + 100 &&
@@ -1248,6 +1268,13 @@ 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);
 
@@ -1280,7 +1306,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 ../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 ../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.762778073 +1100
+++ ./libs/libmythtv/dvbdev/transform.c	2005-01-07 20:18:01.674148524 +1100
@@ -649,8 +647,12 @@ void send_ipack(ipack *p)
 				f=get_ac3info(p->buf+off+3+ac3_off, 
 					      p->count-ac3_off, &ai,0);
 			if ( !f ){
+				if (ai.framesize != 0)
 				nframes = (p->count-off-3-ac3_off)/ 
 					ai.framesize + 1;
+                                else
+                                    nframes = 0;
+
 				p->buf[off+1] = nframes;
 				p->buf[off+2] = (ac3_off >> 8)& 0xFF;
 				p->buf[off+3] = (ac3_off)& 0xFF;
Only in ./libs/libmythtv: dvbdev.o
Only in ./libs/libmythtv: dvbdiseqc.o
diff -buprB ../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.687791221 +1100
+++ ./libs/libmythtv/dvbrecorder.cpp	2005-01-07 18:38:40.565060986 +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;
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: Makefile
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 ../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 ./libs: Makefile
diff -buprB ../mythtv-bigdvb-3.4.orig/Makefile ./Makefile
--- ../mythtv-bigdvb-3.4.orig/Makefile	2005-01-07 20:53:08.256780910 +1100
+++ ./Makefile	2005-01-06 18:19:35.000000000 +1100
@@ -1,6 +1,6 @@
 #############################################################################
 # Makefile for building: mythtv
-# Generated by qmake (1.07a) (Qt 3.3.2) on: Fri Jan  7 20:53:08 2005
+# Generated by qmake (1.07a) (Qt 3.3.2) on: Thu Jan  6 18:19:35 2005
 # Project:  mythtv.pro
 # Template: subdirs
 # Command: $(QMAKE) -o Makefile mythtv.pro
Only in ../mythtv-bigdvb-3.4.orig/: mythtv
Only in ./: oz-ac3-bigdvb3.4.diff
Only in ./programs: Makefile
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: Makefile
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: Makefile
Only in ./programs/mythcommflag: mythcommflag
Only in ./programs/mythepg: main.o
Only in ./programs/mythepg: Makefile
Only in ./programs/mythepg: mythepg
Only in ./programs/mythfilldatabase: filldata.o
Only in ./programs/mythfilldatabase: Makefile
Only in ./programs/mythfilldatabase: mythfilldatabase
Only in ./programs/mythfrontend: channelrecpriority.o
Only in ./programs/mythfrontend: customrecord.o
diff -buprB ../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: Makefile
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: Makefile
Only in ./programs/mythjobqueue: mythjobqueue
Only in ./programs/mythlcd: main.o
Only in ./programs/mythlcd: Makefile
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: Makefile
Only in ./programs/mythprogfind: mythprogfind
Only in ./programs/mythtranscode: main.o
Only in ./programs/mythtranscode: Makefile
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: Makefile
Only in ./programs/mythtv: mythtv
Only in ./programs/mythtvosd: main.o
Only in ./programs/mythtvosd: Makefile
Only in ./programs/mythtvosd: mythtvosd
Only in ./setup: backendsettings.o
Only in ./setup: main.o
Only in ./setup: Makefile
Only in ./setup: setup
Only in ./: setxmltvid.sql
Only in ./themes: dummy.o
Only in ./themes: Makefile
Only in ./themes: themes
_______________________________________________
mythtv-dev mailing list
[email protected]
http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-dev

Reply via email to