Patch for xine-lib that don't need to patch remux.c to work.

Jose Alberto

El Jueves, 25 de Marzo de 2010, Jose Alberto Reguero escribió:
> Patch against latest xine-lib-1.2. New patch for xineliboutput. Now must
> work if you patch remux.c.
> You must have the latest xine-lib and xineliboutput. Yesterday both have
> changes about eac3.
> 
> Jose Alberto
> 
> El Jueves, 25 de Marzo de 2010, zaverel escribió:
> > The typo was on remux.c  => lost  : and ;
> > 
> > Anyway xine-lib has been updated and your patch don't apply.
> > 
> > Update is for eac3 with mkv
> > 
> > i don't test it yet
> > 
> > 
> > 
> > corrected remux.c
> > 
> > line 533
> > case SI::AC3DescriptorTag:
> > +case SI::EnhancedAC3DescriptorTag:
> > 
> > 
> > and in line 191:
> > 
> > -Target[i++] = SI::AC3DescriptorTag;
> > +Target[i++] = SI::EnhancedAC3DescriptorTag;
> > 
> > Le 24/03/2010 22:58, Jose Alberto Reguero a écrit :
> > > I attached a second version of the first patch.
> > > I make the same changes that in the second patch, but maintaining the
> > > logic of the first patch. Also I commented the line:
> > > +//        this->context->request_channels = 2;
> > > because your example has 5 channels. If you have trouble with that you
> > > can comment the line again.
> > > Which  typo error has the second patch?
> > > 
> > > Jose Alberto
> > > 
> > > El Miércoles, 24 de Marzo de 2010, zaverel escribió:
> > >> i 've patched pat.c and now remux.c
> > >> and with use xine-lib-1.2 with your second patch (who has typo error)
> > >> and that doesn't work.
> > >> 
> > >> corrected remux.c
> > >> 
> > >> line 533
> > >> case SI::AC3DescriptorTag:
> > >> +case SI::EnhancedAC3DescriptorTag:
> > >> 
> > >> 
> > >> and in line 191:
> > >> 
> > >> -Target[i++] = SI::AC3DescriptorTag;
> > >> +Target[i++] = SI::EnhancedAC3DescriptorTag;
> > >> 
> > >> 
> > >> 
> > >> with your previously patch and just pat.c patched with
> > >> line 402
> > >> 
> > >> case SI::AC3DescriptorTag:
> > >> +case SI:EnhancedAC3DescriptorTag:
> > >> 
> > >> that worked but not stable.
> > >> 
> > >> Is your sample eac3 has |"Spectral extension" ?
> > >> because in france dvb-t with eac3 has it
> > >> and need a ffmpeg patched for that.
> > >> And i test with that sound.
> > >> 
> > >> Le 24/03/2010 19:41, Jose Alberto Reguero a écrit :
> > >>> It works here with a old sample of tdt with eac3. Have you patch also
> > >>> remux.c? You need to change in line 533:
> > >>> 
> > >>> case SI::AC3DescriptorTag:
> > >>> +case SI:EnhancedAC3DescriptorTag:
> > >>> 
> > >>> and in line 191:
> > >>> 
> > >>> -Target[i++] = SI::AC3DescriptorTag;
> > >>> +Target[i++] = SI::EnhancedAC3DescriptorTag
> > >>> 
> > >>> Jose Alberto
> > >>> 
> > >>> El Miércoles, 24 de Marzo de 2010, dplu escribió:
> > >>>> Hi
> > >>>> 
> > >>>> I have made previous test with the version release by Petri
> > >>>> Hintukainen
> > >>>> 
> > >>>> And I notice this part is not working like it should
> > >>>> 
> > >>>> -    if((m->descriptor_tag == STREAM_AUDIO_AC3) ||    /* ac3 - raw
> > >>>> */ +    if(m->descriptor_tag == HDMV_AUDIO_84_EAC3) {
> > >>>> +      m->content   = p;
> > >>>> +      m->size = packet_len;
> > >>>> +      m->type |= BUF_AUDIO_EAC3;
> > >>>> +      return 1;
> > >>>> +
> > >>>> +    } else if((m->descriptor_tag == STREAM_AUDIO_AC3) ||    /* ac3
> > >>>> - raw */
> > >>>> 
> > >>>> unfortunaletly, in AC3 or E-AC3 , the descriptor tag is
> > >>>> STREAM_AUDIO_AC3, so the program never run the first if (installed a
> > >>>> debug printf here)
> > >>>> 
> > >>>> It seems that your first approach (at least what I understood) by
> > >>>> forcing the decoding of all AC-3 stream by ffmepg instead of
> > >>>> internal lib was nice but generate violent segfault on libavcodec
> > >>>> 
> > >>>> Hope this help you
> > >>>> 
> > >>>> Best regards
> > >>>> 
> > >>>> PS : Sorry to pollute the vdr mailing list (not subscribed to ffmpeg
> > >>>> or xine-lib....)
> > >>>> 
> > >>>> Le Wednesday 24 March 2010 18:41:14 zaverel, vous avez écrit :
> > >>>>> hello
> > >>>>> 
> > >>>>>  your second patch doesn't work  : no sound on eac3 channel
> > >>>>> 
> > >>>>> if you want there is a sample of vdr hd-eac3 recording here:
> > >>>>> 
> > >>>>> http://dl.free.fr/ew4rJddM8
> > >>>>> 
> > >>>>>  103mo
> > >>>>> 
> > >>>>> else , i don't know what mailing-list is the more indicate for
> > >>>>> debuging
> > >>>>> 
> > >>>>> the vdr or xine-dev mailing-list ?
> > >>>>> 
> > >>>>> _______________________________________________
> > >>>>> vdr mailing list
> > >>>>> vdr@linuxtv.org
> > >>>>> http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr
> > >>>> 
> > >>>> _______________________________________________
> > >>>> vdr mailing list
> > >>>> vdr@linuxtv.org
> > >>>> http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr
> > >>> 
> > >>> _______________________________________________
> > >>> vdr mailing list
> > >>> vdr@linuxtv.org
> > >>> http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr
> > > 
> > > _______________________________________________
> > > vdr mailing list
> > > vdr@linuxtv.org
> > > http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr

diff -r fe946ff51bcb src/combined/ffmpeg/ff_audio_decoder.c
--- a/src/combined/ffmpeg/ff_audio_decoder.c	Wed Mar 24 21:02:08 2010 +0000
+++ b/src/combined/ffmpeg/ff_audio_decoder.c	Thu Mar 25 16:05:18 2010 +0100
@@ -257,10 +257,44 @@
 
     if( !this->decoder_ok ) {
       if ( ! this->context || ! this->codec ) {
-        xprintf (this->stream->xine, XINE_VERBOSITY_LOG,
-		_("ffmpeg_audio_dec: trying to open null codec\n"));
-	_x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_HANDLED, 0);
-	return;
+	if (((buf->type & 0xFFFF0000) == BUF_AUDIO_EAC3) || ((buf->type & 0xFFFF0000) == BUF_AUDIO_A52)){ 
+	pthread_mutex_lock (&ffmpeg_lock);
+        this->codec = avcodec_find_decoder(CODEC_ID_EAC3);
+	pthread_mutex_unlock (&ffmpeg_lock);
+        _x_meta_info_set(this->stream, XINE_META_INFO_AUDIOCODEC,
+                           "AC3 coque (ffmpeg)");
+
+        if (!this->codec) {
+          xprintf (this->stream->xine, XINE_VERBOSITY_LOG,
+                   _("ffmpeg_audio_dec: couldn't find ffmpeg decoder for buf type 0x%X\n"),
+                   buf->type);
+          _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_HANDLED, 0);
+          return;
+        }
+
+        this->context = avcodec_alloc_context();
+
+        this->audio_bits = 16;
+//	this->audio_sample_rate = 48000;
+//	this->audio_channels = 6;	
+//        this->context->request_channels = 2;
+
+        this->context->bits_per_sample = this->audio_bits;
+        this->context->sample_rate = this->audio_sample_rate;
+        this->context->channels    = this->audio_channels;
+        this->context->codec_id    = this->codec->id;
+        this->context->codec_type  = this->codec->type;
+        this->context->codec_tag   = _x_stream_info_get(this->stream, XINE_STREAM_INFO_AUDIO_FOURCC);
+
+        this->size = 0;
+
+        this->decode_buffer = calloc(1, AVCODEC_MAX_AUDIO_FRAME_SIZE);
+	} else {
+       	  xprintf (this->stream->xine, XINE_VERBOSITY_LOG,
+		  _("ffmpeg_audio_dec: trying to open null codec\n"));
+	  _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_HANDLED, 0);
+	  return;
+	}
       }
 
       pthread_mutex_lock (&ffmpeg_lock);
@@ -290,6 +324,8 @@
                               &decode_buffer_size,
                               &this->buf[0],
                               this->size);
+	this->size -= bytes_consumed;
+	memmove(this->buf, &this->buf[bytes_consumed], this->size);
 	this->audio_bits = this->context->bits_per_sample;
 	this->audio_sample_rate = this->context->sample_rate;
 	this->audio_channels = this->context->channels;
diff -r fe946ff51bcb src/combined/ffmpeg/xine_audio.list
--- a/src/combined/ffmpeg/xine_audio.list	Wed Mar 24 21:02:08 2010 +0000
+++ b/src/combined/ffmpeg/xine_audio.list	Thu Mar 25 16:05:18 2010 +0100
@@ -41,10 +41,10 @@
 AMR_NB			AMR_NB			AMR narrow band
 AMR_WB			AMR_WB			AMR wide band
 EAC3			EAC3			E-AC-3
+A52			AC3			AC3
 
 # disabled codecs (ref. configure.ac)
 !			AAC
-!			AC3
 !			ADPCM_ADX
 !			ADPCM_G726
 !			DSICINAUDIO
diff -r fe946ff51bcb src/demuxers/demux_ts.c
--- a/src/demuxers/demux_ts.c	Wed Mar 24 21:02:08 2010 +0000
+++ b/src/demuxers/demux_ts.c	Thu Mar 25 16:05:18 2010 +0100
@@ -790,7 +790,13 @@
      * these "raw" streams may begin with a byte that looks like a stream type.
      * For audio streams, m->type already contains the stream no.
      */
-    if((m->descriptor_tag == STREAM_AUDIO_AC3) ||    /* ac3 - raw */
+    if(m->descriptor_tag == HDMV_AUDIO_84_EAC3) {
+      m->content   = p;
+      m->size = packet_len;
+      m->type |= BUF_AUDIO_EAC3;
+      return 1;
+
+    } else if((m->descriptor_tag == STREAM_AUDIO_AC3) ||    /* ac3 - raw */
        (p[0] == 0x0B && p[1] == 0x77)) { /* ac3 - syncword */
       m->content   = p;
       m->size = packet_len;
@@ -1415,9 +1421,9 @@
       break;
     case ISO_13818_PES_PRIVATE:
       for (i = 5; i < coded_length; i += stream[i+1] + 2) {
-          if ((stream[i] == 0x6a) && (this->audio_tracks_count < MAX_AUDIO_TRACKS)) {
-          int i, found = 0;
-          for(i = 0; i < this->audio_tracks_count; i++) {
+          if (((stream[i] == 0x6a) || (stream[i] == 0x7a)) && (this->audio_tracks_count < MAX_AUDIO_TRACKS)) {
+          int j, found = 0;
+          for(j = 0; j < this->audio_tracks_count; j++) {
             if(this->audio_tracks[i].pid == pid) {
               found = 1;
               break;
@@ -1427,8 +1433,12 @@
 #ifdef TS_PMT_LOG
             printf ("demux_ts: PMT AC3 audio pid 0x%.4x type %2.2x\n", pid, stream[0]);
 #endif
-          demux_ts_pes_new(this, this->media_num, pid,
-                           this->audio_fifo, STREAM_AUDIO_AC3);
+          if (stream[i] == 0x6a)
+            demux_ts_pes_new(this, this->media_num, pid,
+                             this->audio_fifo, STREAM_AUDIO_AC3);
+          else
+            demux_ts_pes_new(this, this->media_num, pid,
+                             this->audio_fifo, HDMV_AUDIO_84_EAC3);
 
           this->audio_tracks[this->audio_tracks_count].pid = pid;
           this->audio_tracks[this->audio_tracks_count].media_index = this->media_num;
_______________________________________________
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr

Reply via email to