]> git.sesse.net Git - vlc/blobdiff - modules/codec/ffmpeg/video.c
Compile fix for packaged ffmpeg on debian etch.
[vlc] / modules / codec / ffmpeg / video.c
index 8c3b3a8f17fb42d886f5ff871b722debd771d7cf..88eb6bae71255f689dd1750069f9f5f71638531c 100644 (file)
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <vlc/vlc.h>
 #include <vlc_codec.h>
 #include <vlc_vout.h>
 #include <vlc_input.h>                  /* hmmm, just for INPUT_RATE_DEFAULT */
 
 /* ffmpeg header */
-#ifdef HAVE_FFMPEG_AVCODEC_H
+#ifdef HAVE_LIBAVCODEC_AVCODEC_H
+#   include <libavcodec/avcodec.h>
+#elif defined(HAVE_FFMPEG_AVCODEC_H)
 #   include <ffmpeg/avcodec.h>
 #else
 #   include <avcodec.h>
@@ -118,20 +124,38 @@ static uint32_t ffmpeg_PixFmtToChroma( int i_ff_chroma )
     case PIX_FMT_YUV422:
         return VLC_FOURCC('Y','U','Y','2');
 
+#if defined(WORDS_BIGENDIAN)
+    case PIX_FMT_BGR8:
+        return VLC_FOURCC('R','G','B','8');
+    case PIX_FMT_BGR555:
+        return VLC_FOURCC('R','V','1','5');
+    case PIX_FMT_BGR565:
+        return VLC_FOURCC('R','V','1','6');
+    case PIX_FMT_BGR24:
+        return VLC_FOURCC('R','V','2','4');
+#else
+#if defined(PIX_FMT_RGB8)
+    case PIX_FMT_RGB8:
+        return VLC_FOURCC('R','G','B','8');
+#endif
     case PIX_FMT_RGB555:
         return VLC_FOURCC('R','V','1','5');
     case PIX_FMT_RGB565:
         return VLC_FOURCC('R','V','1','6');
     case PIX_FMT_RGB24:
         return VLC_FOURCC('R','V','2','4');
+#endif
     case PIX_FMT_RGBA32:
         return VLC_FOURCC('R','V','3','2');
+#ifdef PIX_FMT_RGBA
+    case PIX_FMT_RGBA:
+        return VLC_FOURCC('R','G','B','A');
+#endif
     case PIX_FMT_GRAY8:
         return VLC_FOURCC('G','R','E','Y');
 
     case PIX_FMT_YUV410P:
     case PIX_FMT_YUV411P:
-    case PIX_FMT_BGR24:
     default:
         return 0;
     }
@@ -197,7 +221,7 @@ static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec,
 
     if( p_sys->p_pp && p_sys->b_pp && !p_sys->b_pp_init )
     {
-        E_(InitPostproc)( p_dec, p_sys->p_pp, p_context->width,
+        E_(InitPostproc)( p_sys->p_pp, p_context->width,
                           p_context->height, p_context->pix_fmt );
         p_sys->b_pp_init = VLC_TRUE;
     }
@@ -215,12 +239,8 @@ int E_(InitVideoDec)( decoder_t *p_dec, AVCodecContext *p_context,
                       AVCodec *p_codec, int i_codec_id, const char *psz_namecodec )
 {
     decoder_sys_t *p_sys;
-    vlc_mutex_t *lock = var_GetGlobalMutex( "avcodec" );
     vlc_value_t val;
 
-    if( lock == NULL )
-        return VLC_EGENERIC;
-
     /* Allocate the memory needed to store the decoder's structure */
     if( ( p_dec->p_sys = p_sys =
           (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
@@ -382,7 +402,13 @@ int E_(InitVideoDec)( decoder_t *p_dec, AVCodecContext *p_context,
         p_sys->p_context->palctrl = &palette_control;
 
     /* ***** Open the codec ***** */
-    vlc_mutex_lock( lock );
+    vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
+    if( lock == NULL )
+    {
+        free( p_sys );
+        return VLC_ENOMEM;
+    }
+
     if( avcodec_open( p_sys->p_context, p_sys->p_codec ) < 0 )
     {
         vlc_mutex_unlock( lock );
@@ -468,7 +494,9 @@ picture_t *E_(DecodeVideo)( decoder_t *p_dec, block_t **pp_block )
         b_drawpicture = 0;
         if( p_sys->i_late_frames < 8 )
         {
-            p_sys->p_context->skip_frame = AVDISCARD_NONKEY;
+            p_sys->p_context->skip_frame =
+                    (p_sys->i_skip_frame <= AVDISCARD_BIDIR) ?
+                    AVDISCARD_BIDIR : p_sys->i_skip_frame;
         }
         else
         {
@@ -571,7 +599,7 @@ picture_t *E_(DecodeVideo)( decoder_t *p_dec, block_t **pp_block )
         }
 
         /* Update frame late count (except when doing preroll) */
-        if( p_sys->i_pts && p_sys->i_pts <= mdate() &&
+        if( p_sys->i_pts && decoder_GetDisplayDate(p_dec, p_sys->i_pts) <= mdate() &&
             !(p_block->i_flags & BLOCK_FLAG_PREROLL) )
         {
             p_sys->i_late_frames++;
@@ -793,7 +821,7 @@ static void ffmpeg_CopyPicture( decoder_t *p_dec,
         int i_src_stride, i_dst_stride;
 
         if( p_sys->p_pp && p_sys->b_pp )
-            E_(PostprocPict)( p_dec, p_sys->p_pp, p_pic, p_ff_pic );
+            E_(PostprocPict)( p_sys->p_pp, p_pic, p_ff_pic );
         else
         {
             for( i_plane = 0; i_plane < p_pic->i_planes; i_plane++ )
@@ -824,14 +852,25 @@ static void ffmpeg_CopyPicture( decoder_t *p_dec,
         {
         case PIX_FMT_YUV410P:
         case PIX_FMT_YUV411P:
+        case PIX_FMT_RGB32:
+        case PIX_FMT_RGB24:
+#if defined(PIX_FMT_RGB8)
+        case PIX_FMT_RGB8:
+#endif
+#if defined(PIX_FMT_BRG32)
+        case PIX_FMT_BGR32:
+#endif
         case PIX_FMT_BGR24:
+#if defined(PIX_FMT_BGR8)
+        case PIX_FMT_BGR8:
+#endif
         case PIX_FMT_PAL8:
             for( i = 0; i < p_pic->i_planes; i++ )
             {
                 dest_pic.data[i] = p_pic->p[i].p_pixels;
                 dest_pic.linesize[i] = p_pic->p[i].i_pitch;
             }
-#if !defined(HAVE_FFMPEG_SWSCALE_H) && !defined(HAVE_LIBSWSCALE_TREE)
+#if !defined(HAVE_LIBSWSCALE_SWSCALE_H)  && !defined(HAVE_FFMPEG_SWSCALE_H) && !defined(HAVE_LIBSWSCALE_TREE)
             img_convert( &dest_pic, PIX_FMT_YUV420P,
                          (AVPicture *)p_ff_pic,
                          p_sys->p_context->pix_fmt,