changeset 10658:c5e7b34bfc19

Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
author alex
date Mon, 18 Aug 2003 13:13:41 +0000
parents 5678a8ab7979
children 7c404c64a2bc
files configure libmpcodecs/vd_theora.c libmpdemux/demux_ogg.c
diffstat 3 files changed, 64 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/configure	Mon Aug 18 12:23:54 2003 +0000
+++ b/configure	Mon Aug 18 13:13:41 2003 +0000
@@ -4162,14 +4162,48 @@
   _def_tremor='#undef TREMOR'
   _nocodecmodules="libvorbis $_nocodecmodules"
 fi
-echores "$_vorbis"
-
-echocheck "OggTheora support"
+if test "$_vorbis" = yes -a "$_tremor" = yes ; then
+  echores "$_vorbis (Tremor)"
+else
+  echores "$_vorbis"
+fi
+
+echocheck "OggTheora support (only the CVS version!)"
 if test "$_theora" = auto ; then
   _theora=no
   cat > $TMPC << EOF
 #include <theora/theora.h>
-int main(void) { theora_version_number (); return 0; }
+#include <string.h>
+int main(void) 
+{ 
+  /* theora is in flux, make sure that all interface routines and 
+   * datatypes exist and work the way we expect it, so we don't break
+   * mplayer */
+  ogg_packet op;
+  theora_comment tc;
+  theora_info inf;
+  theora_state st;
+  yuv_buffer yuv;
+  int r;
+  double t;
+
+  theora_info_init (&inf);
+  theora_comment_init (&tc);
+ 
+  return 0;
+
+  /* we don't want to execute this kind of nonsense; just for making sure
+   * that compilation works... */
+  memset(&op, 0, sizeof(op));
+  r = theora_decode_header (&inf, &tc, &op);
+  r = theora_decode_init (&st, &inf);
+  t = theora_granule_time (&st, op.granulepos);
+  r = theora_decode_packetin (&st, &op);
+  r = theora_decode_YUVout (&st, &yuv);
+  theora_clear (&st);
+
+  return 0;
+}
 EOF
   cc_check -ltheora -logg -lm && _theora=yes
 fi
--- a/libmpcodecs/vd_theora.c	Mon Aug 18 12:23:54 2003 +0000
+++ b/libmpcodecs/vd_theora.c	Mon Aug 18 13:13:41 2003 +0000
@@ -23,6 +23,8 @@
 
 #include <theora/theora.h>
 
+#define THEORA_NUM_HEADER_PACKETS 3
+
 // to set/get/query special features/parameters
 static int control(sh_video_t *sh,int cmd,void* arg,...){
     return CONTROL_UNKNOWN;
@@ -30,6 +32,7 @@
 
 typedef struct theora_struct_st {
     theora_state st;
+    theora_comment cc;
     theora_info inf;
 } theora_struct_t;
 
@@ -41,7 +44,7 @@
     int failed = 1;
     int errorCode = 0;
     ogg_packet op;
-//    theora_comment tc;
+    int i;
 
     /* check whether video output format is supported */
     switch(sh->codec->outfmt[sh->outfmtidx])
@@ -60,35 +63,23 @@
        sh->context = context;
        if (!context)
 	  break;
+
+       theora_info_init(&context->inf);
+       theora_comment_init(&context->cc);
        
-       /* read initial header */
-       op.bytes = ds_get_packet (sh->ds,&op.packet);
-       op.b_o_s  = 1;
-       if((errorCode = theora_decode_header (&context->inf, &op))) {
-	  mp_msg(MSGT_DECAUDIO,MSGL_ERR, 
-		 "Broken Theora header; erroroCode=%i!\n", errorCode);
-	  break;
+       /* Read all header packets, pass them to theora_decode_header. */
+       for (i = 0; i < THEORA_NUM_HEADER_PACKETS; i++)
+       {
+          op.bytes = ds_get_packet (sh->ds, &op.packet);
+          op.b_o_s = 1;
+          if ( (errorCode = theora_decode_header (&context->inf, &context->cc, &op)) )
+          {
+            mp_msg(MSGT_DECAUDIO, MSGL_ERR, "Broken Theora header; errorCode=%i!\n", errorCode);
+            break;
+          }
        }
-
-       /* decode comment packet */
-       op.bytes = ds_get_packet (sh->ds,&op.packet);
-       op.b_o_s  = 1;
-#if 0
-       if((errorCode = theora_decode_comment (&tc, &op))) {
-	  mp_msg(MSGT_DECVIDEO,MSGL_ERR, 
-		 "Broken Theora comment; erroroCode=%i!\n", errorCode);
-	  break;
-       }
-#endif
-
-       /* decode tables packet */
-       op.bytes = ds_get_packet (sh->ds,&op.packet);
-       op.b_o_s  = 1;
-       if((errorCode = theora_decode_tables (&context->inf, &op))) {
-	  mp_msg(MSGT_DECVIDEO,MSGL_ERR, 
-		 "Broken Theora comment; erroroCode=%i!\n", errorCode);
-	  break;
-       }
+       if (errorCode)
+          break;
 
        /* now init codec */
        errorCode = theora_decode_init (&context->st, &context->inf);
--- a/libmpdemux/demux_ogg.c	Mon Aug 18 12:23:54 2003 +0000
+++ b/libmpdemux/demux_ogg.c	Mon Aug 18 13:13:41 2003 +0000
@@ -50,6 +50,7 @@
 #ifdef HAVE_OGGTHEORA
 typedef struct theora_struct_st {
     theora_state st;
+    theora_comment cc;
     theora_info inf;
 } theora_struct_t;
 #endif
@@ -633,7 +634,12 @@
     } else if (pack.bytes >= 7 && !strncmp (&pack.packet[1], "theora", 6)) {
 	int errorCode = 0;
 	theora_info inf;
-	errorCode = theora_decode_header (&inf, &pack);
+	theora_comment cc;
+	
+	theora_info_init (&inf);
+	theora_comment_init (&cc);
+	
+	errorCode = theora_decode_header (&inf, &cc, &pack);
 	if (errorCode)
 	    mp_msg(MSGT_DEMUX,MSGL_ERR,"Theora header parsing failed: %i \n",
 		   errorCode);