[MPlayer-cvslog] CVS: main/libmpdemux demux_ogg.c,1.68,1.69

Moritz Bunkus CVS syncmail at mplayerhq.hu
Sun May 1 12:40:44 CEST 2005


CVS change done by Moritz Bunkus CVS

Update of /cvsroot/mplayer/main/libmpdemux
In directory mail:/var2/tmp/cvs-serv27436

Modified Files:
	demux_ogg.c 
Log Message:
Nasty workaround for codec initialization data. In _at least_ one case (AAC) the stream_header.size element seems to be four bytes off. Skip those bytes but only for known cases (again AAC) and not for all.

Index: demux_ogg.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/demux_ogg.c,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -r1.68 -r1.69
--- demux_ogg.c	27 Feb 2005 18:11:16 -0000	1.68
+++ demux_ogg.c	1 May 2005 10:40:42 -0000	1.69
@@ -973,8 +973,21 @@
       } else if(strncmp(st->streamtype,"audio",5) == 0) {
 	char buffer[5];
 	unsigned int extra_size = get_uint32 (&st->size) - sizeof(stream_header);
+	unsigned int extra_offset = 0;
+
 	memcpy(buffer,st->subtype,4);
 	buffer[4] = '\0';
+
+        /* Nasty workaround. stream_header.size seems not to contain the real
+           size in all cases. There are four extra bytes that are unaccounted
+           for in front of the real codec initialization data _at least_ for
+           AAC. So far I've only seen those bytes being all 0, so we can
+           just skip them here. */
+	if ((strtol(buffer, NULL, 16) == 0xff) && (extra_size >= 4)) {
+	  extra_size -= 4;
+	  extra_offset = 4;
+	}
+
 	sh_a = new_sh_audio(demuxer,ogg_d->num_sub);
 	sh_a->wf = (WAVEFORMATEX*)calloc(1,sizeof(WAVEFORMATEX)+extra_size);
 	sh_a->format =  sh_a->wf->wFormatTag = strtol(buffer, NULL, 16);
@@ -986,7 +999,7 @@
 	sh_a->samplesize = (sh_a->wf->wBitsPerSample+7)/8;
 	sh_a->wf->cbSize = extra_size;
 	if(extra_size)
-	  memcpy(((char *)sh_a->wf)+sizeof(WAVEFORMATEX),st+1,extra_size);
+	  memcpy(((char *)sh_a->wf)+sizeof(WAVEFORMATEX),((char *)(st+1))+extra_offset,extra_size);
 
 	ogg_d->subs[ogg_d->num_sub].samplerate = sh_a->samplerate; // * sh_a->channels;
 	if (identify)




More information about the MPlayer-cvslog mailing list