[PATCH] fix libtheora linking issue with modern theora versions

This is a squash/backport of upstream r34498 (configure: Simplify
Theora check) and r34503 (Port libtheora glue code to Theora 1.0 API).

Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
---
 configure               |   56 ++++--------------------------------
 libmpcodecs/vd_theora.c |   74 +++++++++++++++++++++++++-----------------------
 libmpdemux/demux_ogg.c  |   54 ++++++++++++++++++-----------------
 3 files changed, 74 insertions(+), 110 deletions(-)

Index: mplayer-32726/configure
===================================================================
--- mplayer-32726.orig/configure
+++ mplayer-32726/configure
@@ -6404,57 +6404,15 @@
 echocheck "OggTheora support"
 if test "$_theora" = auto ; then
   _theora=no
-    cat > $TMPC << EOF
-#include <theora/theora.h>
-#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
-  _ld_theora=$($_pkg_config --silence-errors --libs theora)
-  _inc_theora=$($_pkg_config --silence-errors --cflags theora)
-  cc_check $_inc_theora $_ld_theora && extra_ldflags="$extra_ldflags $_ld_theora" &&
-    extra_cflags="$extra_cflags $_inc_theora" && _theora=yes
+  ld_theora="-ltheoradec -logg"
+  statement_check theora/theoradec.h 'theora_info_init(NULL)' $ld_theora &&
+    extra_ldflags="$extra_ldflags $ld_theora" && _theora=yes
   if test _theora = no; then
-    _ld_theora="-ltheora -logg"
-    cc_check $_ld_theora && extra_ldflags="$extra_ldflags $_ld_theora" && _theora=yes
-  fi
-  if test "$_theora" = no && test "$_tremor_internal" = yes; then
-    _ld_theora=$($_pkg_config --silence-errors --libs theora)
-    _inc_theora=$($_pkg_config --silence-errors --cflags theora)
-    cc_check tremor/bitwise.c $_inc_theora $_ld_theora &&
+    _ld_theora=$($_pkg_config --silence-errors --libs theoradec)
+    _inc_theora=$($_pkg_config --silence-errors --cflags theoradec)
+    statement_check theora/theoradec.h 'theora_info_init(NULL)' $inc_theora $ld_theora &&
       extra_ldflags="$extra_ldflags $_ld_theora" &&
       extra_cflags="$extra_cflags $_inc_theora" && _theora=yes
-    if test _theora = no; then
-      _ld_theora="-ltheora -logg"
-      cc_check tremor/bitwise.c $_ld_theora &&
-        extra_ldflags="$extra_ldflags $_ld_theora" && _theora=yes
-    fi
   fi
 fi
 if test "$_theora" = yes ; then
@@ -6462,7 +6420,7 @@
   codecmodules="libtheora $codecmodules"
   # when --enable-theora is forced, we'd better provide a probably sane
   # $_ld_theora than nothing
-  test -z "$_ld_theora" && extra_ldflags="$extra_ldflags -ltheora -logg"
+  test -z "$_ld_theora" && extra_ldflags="$extra_ldflags -ltheoradec -logg"
 else
   def_theora='#undef CONFIG_OGGTHEORA'
   nocodecmodules="libtheora $nocodecmodules"
Index: mplayer-32726/libmpcodecs/vd_theora.c
===================================================================
--- mplayer-32726.orig/libmpcodecs/vd_theora.c
+++ mplayer-32726/libmpcodecs/vd_theora.c
@@ -39,22 +39,23 @@
 
 LIBVD_EXTERN(theora)
 
-#include <theora/theora.h>
+#include <theora/theoradec.h>
 
 #define THEORA_NUM_HEADER_PACKETS 3
 
 typedef struct theora_struct_st {
-    theora_state st;
-    theora_comment cc;
-    theora_info inf;
+    th_setup_info *tsi;
+    th_dec_ctx    *tctx;
+    th_comment     tc;
+    th_info        ti;
 } theora_struct_t;
 
 /** Convert Theora pixelformat to the corresponding IMGFMT_ */
-static uint32_t theora_pixelformat2imgfmt(theora_pixelformat fmt){
+static uint32_t theora_pixelformat2imgfmt(th_pixel_fmt fmt){
     switch(fmt) {
-       case OC_PF_420: return IMGFMT_YV12;
-       case OC_PF_422: return IMGFMT_422P;
-       case OC_PF_444: return IMGFMT_444P;
+       case TH_PF_420: return IMGFMT_YV12;
+       case TH_PF_422: return IMGFMT_422P;
+       case TH_PF_444: return IMGFMT_444P;
     }
     return 0;
 }
@@ -64,7 +65,7 @@
     theora_struct_t *context = sh->context;
     switch(cmd) {
     case VDCTRL_QUERY_FORMAT:
-        if (*(int*)arg == theora_pixelformat2imgfmt(context->inf.pixelformat))
+        if (*(int*)arg == theora_pixelformat2imgfmt(context->ti.pixel_fmt))
 	    return CONTROL_TRUE;
 	return CONTROL_FALSE;
     }
@@ -88,8 +89,9 @@
     if (!context)
         goto err_out;
 
-    theora_info_init(&context->inf);
-    theora_comment_init(&context->cc);
+    th_info_init(&context->ti);
+    th_comment_init(&context->tc);
+    context->tsi = NULL;
 
     /* Read all header packets, pass them to theora_decode_header. */
     for (i = 0; i < THEORA_NUM_HEADER_PACKETS; i++)
@@ -109,7 +111,7 @@
             op.b_o_s = 1;
         }
 
-        if ( (errorCode = theora_decode_header (&context->inf, &context->cc, &op)) )
+        if ( (errorCode = th_decode_headerin (&context->ti, &context->tc, &context->tsi, &op)) < 0)
         {
             mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Broken Theora header; errorCode=%i!\n", errorCode);
             goto err_out;
@@ -117,23 +119,25 @@
     }
 
     /* now init codec */
-    errorCode = theora_decode_init (&context->st, &context->inf);
-    if (errorCode)
+    context->tctx = th_decode_alloc (&context->ti, context->tsi);
+    if (!context->tctx)
     {
-        mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Theora decode init failed: %i \n", errorCode);
+        mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Theora decode init failed\n");
         goto err_out;
     }
+    /* free memory used for decoder setup information */
+    th_setup_free(context->tsi);
 
-    if(sh->aspect==0.0 && context->inf.aspect_denominator!=0)
+    if(sh->aspect==0.0 && context->ti.aspect_denominator!=0)
     {
-       sh->aspect = ((double)context->inf.aspect_numerator * context->inf.width)/
-          ((double)context->inf.aspect_denominator * context->inf.height);
+       sh->aspect = ((double)context->ti.aspect_numerator * context->ti.frame_width)/
+          ((double)context->ti.aspect_denominator * context->ti.frame_height);
     }
 
     mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: Theora video init ok!\n");
-    mp_msg(MSGT_DECVIDEO,MSGL_INFO,"Frame: %dx%d, Picture %dx%d, Offset [%d,%d]\n", context->inf.width, context->inf.height, context->inf.frame_width, context->inf.frame_height, context->inf.offset_x, context->inf.offset_y);
+    mp_msg(MSGT_DECVIDEO,MSGL_INFO,"Frame: %dx%d, Picture %dx%d, Offset [%d,%d]\n", context->ti.frame_width, context->ti.frame_height, context->ti.pic_width, context->ti.pic_height, context->ti.pic_x, context->ti.pic_y);
 
-    return mpcodecs_config_vo (sh,context->inf.width,context->inf.height,theora_pixelformat2imgfmt(context->inf.pixelformat));
+    return mpcodecs_config_vo (sh,context->ti.frame_width,context->ti.frame_height,theora_pixelformat2imgfmt(context->ti.pixel_fmt));
 
 err_out:
     free(context);
@@ -150,9 +154,9 @@
 
    if (context)
    {
-      theora_info_clear(&context->inf);
-      theora_comment_clear(&context->cc);
-      theora_clear (&context->st);
+      th_info_clear(&context->ti);
+      th_comment_clear(&context->tc);
+      th_decode_free (context->tctx);
       free (context);
    }
 }
@@ -165,7 +169,7 @@
    theora_struct_t *context = sh->context;
    int errorCode = 0;
    ogg_packet op;
-   yuv_buffer yuv;
+   th_ycbcr_buffer ycbcrbuf;
    mp_image_t* mpi;
 
    // no delayed frames
@@ -177,31 +181,31 @@
    op.packet = data;
    op.granulepos = -1;
 
-   errorCode = theora_decode_packetin (&context->st, &op);
-   if (errorCode)
+   errorCode = th_decode_packetin (context->tctx, &op, NULL);
+   if (errorCode < 0)
    {
       mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Theora decode packetin failed: %i \n",
 	     errorCode);
       return NULL;
    }
 
-   errorCode = theora_decode_YUVout (&context->st, &yuv);
-   if (errorCode)
+   errorCode = th_decode_ycbcr_out (context->tctx, ycbcrbuf);
+   if (errorCode < 0)
    {
       mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Theora decode YUVout failed: %i \n",
 	     errorCode);
       return NULL;
    }
 
-    mpi = mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, 0, yuv.y_width, yuv.y_height);
+    mpi = mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, 0, ycbcrbuf[0].width, ycbcrbuf[0].height);
     if(!mpi) return NULL;
 
-    mpi->planes[0]=yuv.y;
-    mpi->stride[0]=yuv.y_stride;
-    mpi->planes[1]=yuv.u;
-    mpi->stride[1]=yuv.uv_stride;
-    mpi->planes[2]=yuv.v;
-    mpi->stride[2]=yuv.uv_stride;
+    mpi->planes[0]=ycbcrbuf[0].data;
+    mpi->stride[0]=ycbcrbuf[0].stride;
+    mpi->planes[1]=ycbcrbuf[1].data;
+    mpi->stride[1]=ycbcrbuf[1].stride;
+    mpi->planes[2]=ycbcrbuf[2].data;
+    mpi->stride[2]=ycbcrbuf[2].stride;
 
     return mpi;
 }
Index: mplayer-32726/libmpdemux/demux_ogg.c
===================================================================
--- mplayer-32726.orig/libmpdemux/demux_ogg.c
+++ mplayer-32726/libmpdemux/demux_ogg.c
@@ -49,21 +49,21 @@
 #endif
 
 #ifdef CONFIG_OGGTHEORA
-#include <theora/theora.h>
-int _ilog (unsigned int); /* defined in many places in theora/lib/ */
+#include <theora/theoradec.h>
 #endif
 
 #define BLOCK_SIZE 4096
 
 /* Theora decoder context : we won't be able to interpret granule positions
- * without using theora_granule_time with the theora_state of the stream.
+ * without using th_granule_time with the th_dec_ctx of the stream.
  * This is duplicated in `vd_theora.c'; put this in a common header?
  */
 #ifdef CONFIG_OGGTHEORA
 typedef struct theora_struct_st {
-    theora_state   st;
-    theora_comment cc;
-    theora_info    inf;
+    th_setup_info *tsi;
+    th_dec_ctx    *tctx;
+    th_comment     tc;
+    th_info        ti;
 } theora_struct_t;
 #endif
 
@@ -116,7 +116,7 @@
     float   samplerate; /// granulpos 2 time
     int64_t lastpos;
     int32_t lastsize;
-    int     keyframe_frequency_force;
+    int     keyframe_granule_shift;
 
     // Logical stream state
     ogg_stream_state stream;
@@ -299,11 +299,10 @@
            have theora_state st, until all header packets were passed to the
            decoder. */
         if (!pack->bytes || !(*data&0x80)) {
-            int keyframe_granule_shift = _ilog(os->keyframe_frequency_force - 1);
-            int64_t iframemask = (1 << keyframe_granule_shift) - 1;
+            int64_t iframemask = (1 << os->keyframe_granule_shift) - 1;
 
             if (pack->granulepos >= 0) {
-                os->lastpos  = pack->granulepos >> keyframe_granule_shift;
+                os->lastpos  = pack->granulepos >> os->keyframe_granule_shift;
                 os->lastpos += pack->granulepos & iframemask;
                 *flags = (pack->granulepos & iframemask) == 0;
             } else {
@@ -892,14 +891,15 @@
 #ifdef CONFIG_OGGTHEORA
         } else if (pack.bytes >= 7 && !strncmp (&pack.packet[1], "theora", 6)) {
             int errorCode = 0;
-            theora_info inf;
-            theora_comment cc;
+            th_info ti;
+            th_comment tc;
+            th_setup_info *tsi = NULL;
 
-            theora_info_init (&inf);
-            theora_comment_init (&cc);
+            th_info_init (&ti);
+            th_comment_init (&tc);
 
-            errorCode = theora_decode_header (&inf, &cc, &pack);
-            if (errorCode) {
+            errorCode = th_decode_headerin(&ti, &tc, &tsi, &pack);
+            if (errorCode < 0) {
                 mp_msg(MSGT_DEMUX, MSGL_ERR,
                        "Theora header parsing failed: %i \n", errorCode);
             } else {
@@ -908,30 +908,32 @@
                 sh_v->bih = calloc(1, sizeof(*sh_v->bih));
                 sh_v->bih->biSize        = sizeof(*sh_v->bih);
                 sh_v->bih->biCompression = sh_v->format = FOURCC_THEORA;
-                sh_v->fps = ((double)inf.fps_numerator) / (double)inf.fps_denominator;
-                sh_v->frametime = ((double)inf.fps_denominator) / (double)inf.fps_numerator;
-                sh_v->disp_w = sh_v->bih->biWidth  = inf.frame_width;
-                sh_v->disp_h = sh_v->bih->biHeight = inf.frame_height;
+                sh_v->fps = ((double)ti.fps_numerator) / (double)ti.fps_denominator;
+                sh_v->frametime = ((double)ti.fps_denominator) / (double)ti.fps_numerator;
+                sh_v->i_bps  = ti.target_bitrate / 8;
+                sh_v->disp_w = sh_v->bih->biWidth  = ti.frame_width;
+                sh_v->disp_h = sh_v->bih->biHeight = ti.frame_height;
                 sh_v->bih->biBitCount  = 24;
                 sh_v->bih->biPlanes    = 3;
                 sh_v->bih->biSizeImage = ((sh_v->bih->biBitCount / 8) * sh_v->bih->biWidth * sh_v->bih->biHeight);
                 ogg_d->subs[ogg_d->num_sub].samplerate               = sh_v->fps;
                 ogg_d->subs[ogg_d->num_sub].theora                   = 1;
-                ogg_d->subs[ogg_d->num_sub].keyframe_frequency_force = inf.keyframe_frequency_force;
+                ogg_d->subs[ogg_d->num_sub].keyframe_granule_shift   = ti.keyframe_granule_shift;
                 ogg_d->subs[ogg_d->num_sub].id                       = n_video;
                 n_video++;
                 mp_msg(MSGT_DEMUX, MSGL_INFO,
                        "[Ogg] stream %d: video (Theora v%d.%d.%d), -vid %d\n",
                        ogg_d->num_sub,
-                       (int)inf.version_major,
-                       (int)inf.version_minor,
-                       (int)inf.version_subminor,
+                       (int)ti.version_major,
+                       (int)ti.version_minor,
+                       (int)ti.version_subminor,
                        n_video - 1);
                 if (mp_msg_test(MSGT_HEADER, MSGL_V))
                     print_video_header(sh_v->bih, MSGL_V);
             }
-            theora_comment_clear(&cc);
-            theora_info_clear(&inf);
+            th_comment_clear(&tc);
+            th_info_clear(&ti);
+            th_setup_free(tsi);
 #endif /* CONFIG_OGGTHEORA */
         } else if (pack.bytes >= 4 && !strncmp (&pack.packet[0], "fLaC", 4)) {
             sh_a = new_sh_audio_aid(demuxer, ogg_d->num_sub, n_audio, NULL);
