video.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:28k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * video.c: video decoder using the ffmpeg library
  3.  *****************************************************************************
  4.  * Copyright (C) 1999-2001 VideoLAN
  5.  * $Id: video.c 9156 2004-11-05 14:57:53Z gbazin $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Gildas Bazin <gbazin@videolan.org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. /*****************************************************************************
  25.  * Preamble
  26.  *****************************************************************************/
  27. #include <vlc/vlc.h>
  28. #include <vlc/decoder.h>
  29. /* ffmpeg header */
  30. #ifdef HAVE_FFMPEG_AVCODEC_H
  31. #   include <ffmpeg/avcodec.h>
  32. #else
  33. #   include <avcodec.h>
  34. #endif
  35. #include "ffmpeg.h"
  36. /*****************************************************************************
  37.  * decoder_sys_t : decoder descriptor
  38.  *****************************************************************************/
  39. struct decoder_sys_t
  40. {
  41.     /* Common part between video and audio decoder */
  42.     int i_cat;
  43.     int i_codec_id;
  44.     char *psz_namecodec;
  45.     AVCodecContext      *p_context;
  46.     AVCodec             *p_codec;
  47.     /* Video decoder specific part */
  48.     mtime_t input_pts;
  49.     mtime_t input_dts;
  50.     mtime_t i_pts;
  51.     AVFrame          *p_ff_pic;
  52.     BITMAPINFOHEADER *p_format;
  53.     /* for frame skipping algo */
  54.     int b_hurry_up;
  55.     int i_frame_skip;
  56.     /* how many decoded frames are late */
  57.     int     i_late_frames;
  58.     mtime_t i_late_frames_start;
  59.     /* for direct rendering */
  60.     int b_direct_rendering;
  61.     vlc_bool_t b_has_b_frames;
  62.     /* Hack to force display of still pictures */
  63.     vlc_bool_t b_first_frame;
  64.     int i_buffer_orig, i_buffer;
  65.     char *p_buffer_orig, *p_buffer;
  66.     /* Postprocessing handle */
  67.     void *p_pp;
  68.     vlc_bool_t b_pp;
  69.     vlc_bool_t b_pp_async;
  70.     vlc_bool_t b_pp_init;
  71. };
  72. /* FIXME (dummy palette for now) */
  73. static AVPaletteControl palette_control;
  74. /*****************************************************************************
  75.  * Local prototypes
  76.  *****************************************************************************/
  77. static void ffmpeg_CopyPicture    ( decoder_t *, picture_t *, AVFrame * );
  78. static int  ffmpeg_GetFrameBuf    ( struct AVCodecContext *, AVFrame * );
  79. static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *, AVFrame * );
  80. static uint32_t ffmpeg_CodecTag( vlc_fourcc_t fcc )
  81. {
  82.     uint8_t *p = (uint8_t*)&fcc;
  83.     return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
  84. }
  85. /*****************************************************************************
  86.  * Local Functions
  87.  *****************************************************************************/
  88. static uint32_t ffmpeg_PixFmtToChroma( int i_ff_chroma )
  89. {
  90.     switch( i_ff_chroma )
  91.     {
  92.     case PIX_FMT_YUV420P:
  93.         return VLC_FOURCC('I','4','2','0');
  94.     case PIX_FMT_YUV422P:
  95.         return VLC_FOURCC('I','4','2','2');
  96.     case PIX_FMT_YUV444P:
  97.         return VLC_FOURCC('I','4','4','4');
  98.     case PIX_FMT_YUV422:
  99.         return VLC_FOURCC('Y','U','Y','2');
  100.     case PIX_FMT_RGB555:
  101.         return VLC_FOURCC('R','V','1','5');
  102.     case PIX_FMT_RGB565:
  103.         return VLC_FOURCC('R','V','1','6');
  104.     case PIX_FMT_RGB24:
  105.         return VLC_FOURCC('R','V','2','4');
  106.     case PIX_FMT_RGBA32:
  107.         return VLC_FOURCC('R','V','3','2');
  108.     case PIX_FMT_GRAY8:
  109.         return VLC_FOURCC('G','R','E','Y');
  110.     case PIX_FMT_YUV410P:
  111.     case PIX_FMT_YUV411P:
  112.     case PIX_FMT_BGR24:
  113.     default:
  114.         return 0;
  115.     }
  116. }
  117. /* Returns a new picture buffer */
  118. static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec,
  119.                                             AVCodecContext *p_context )
  120. {
  121.     decoder_sys_t *p_sys = p_dec->p_sys;
  122.     picture_t *p_pic;
  123.     p_dec->fmt_out.video.i_width = p_context->width;
  124.     p_dec->fmt_out.video.i_height = p_context->height;
  125.     p_dec->fmt_out.i_codec = ffmpeg_PixFmtToChroma( p_context->pix_fmt );
  126.     if( !p_context->width || !p_context->height )
  127.     {
  128.         return NULL; /* invalid display size */
  129.     }
  130.     if( !p_dec->fmt_out.i_codec )
  131.     {
  132.         /* we make conversion if possible*/
  133.         p_dec->fmt_out.i_codec = VLC_FOURCC('I','4','2','0');
  134.     }
  135.     /* If an aspect-ratio was specified in the input format then force it */
  136.     if( p_dec->fmt_in.video.i_aspect )
  137.     {
  138.         p_dec->fmt_out.video.i_aspect = p_dec->fmt_in.video.i_aspect;
  139.     }
  140.     else
  141.     {
  142. #if LIBAVCODEC_BUILD >= 4687
  143.         p_dec->fmt_out.video.i_aspect =
  144.             VOUT_ASPECT_FACTOR * ( av_q2d(p_context->sample_aspect_ratio) *
  145.                 p_context->width / p_context->height );
  146. #else
  147.         p_dec->fmt_out.video.i_aspect =
  148.             VOUT_ASPECT_FACTOR * p_context->aspect_ratio;
  149. #endif
  150.         if( p_dec->fmt_out.video.i_aspect == 0 )
  151.         {
  152.             p_dec->fmt_out.video.i_aspect =
  153.                 VOUT_ASPECT_FACTOR * p_context->width / p_context->height;
  154.         }
  155.     }
  156.     if( p_context->frame_rate > 0 && p_context->frame_rate_base > 0 )
  157.     {
  158.         p_dec->fmt_out.video.i_frame_rate = p_context->frame_rate;
  159.         p_dec->fmt_out.video.i_frame_rate_base = p_context->frame_rate_base;
  160.     }
  161.     p_pic = p_dec->pf_vout_buffer_new( p_dec );
  162. #ifdef LIBAVCODEC_PP
  163.     if( p_sys->p_pp && p_sys->b_pp && !p_sys->b_pp_init )
  164.     {
  165.         E_(InitPostproc)( p_dec, p_sys->p_pp, p_context->width,
  166.                           p_context->height, p_context->pix_fmt );
  167.         p_sys->b_pp_init = VLC_TRUE;
  168.     }
  169. #endif
  170.     return p_pic;
  171. }
  172. /*****************************************************************************
  173.  * InitVideo: initialize the video decoder
  174.  *****************************************************************************
  175.  * the ffmpeg codec will be opened, some memory allocated. The vout is not yet
  176.  * opened (done after the first decoded frame).
  177.  *****************************************************************************/
  178. int E_(InitVideoDec)( decoder_t *p_dec, AVCodecContext *p_context,
  179.                       AVCodec *p_codec, int i_codec_id, char *psz_namecodec )
  180. {
  181.     decoder_sys_t *p_sys;
  182.     vlc_value_t lockval;
  183.     vlc_value_t val;
  184.     var_Get( p_dec->p_libvlc, "avcodec", &lockval );
  185.     /* Allocate the memory needed to store the decoder's structure */
  186.     if( ( p_dec->p_sys = p_sys =
  187.           (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
  188.     {
  189.         msg_Err( p_dec, "out of memory" );
  190.         return VLC_EGENERIC;
  191.     }
  192.     p_dec->p_sys->p_context = p_context;
  193.     p_dec->p_sys->p_codec = p_codec;
  194.     p_dec->p_sys->i_codec_id = i_codec_id;
  195.     p_dec->p_sys->psz_namecodec = psz_namecodec;
  196.     p_sys->p_ff_pic = avcodec_alloc_frame();
  197.     /* ***** Fill p_context with init values ***** */
  198.     /* FIXME: remove when ffmpeg deals properly with avc1 */
  199.     if( p_dec->fmt_in.i_codec != VLC_FOURCC('a','v','c','1') )
  200.     /* End FIXME */
  201.     p_sys->p_context->codec_tag = ffmpeg_CodecTag( p_dec->fmt_in.i_codec );
  202.     p_sys->p_context->width  = p_dec->fmt_in.video.i_width;
  203.     p_sys->p_context->height = p_dec->fmt_in.video.i_height;
  204.     p_sys->p_context->bits_per_sample = p_dec->fmt_in.video.i_bits_per_pixel;
  205.     /*  ***** Get configuration of ffmpeg plugin ***** */
  206.     p_sys->p_context->workaround_bugs =
  207.         config_GetInt( p_dec, "ffmpeg-workaround-bugs" );
  208.     p_sys->p_context->error_resilience =
  209.         config_GetInt( p_dec, "ffmpeg-error-resilience" );
  210.     var_Create( p_dec, "grayscale", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  211.     var_Get( p_dec, "grayscale", &val );
  212.     if( val.b_bool ) p_sys->p_context->flags |= CODEC_FLAG_GRAY;
  213.     var_Create( p_dec, "ffmpeg-vismv", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
  214.     var_Get( p_dec, "ffmpeg-vismv", &val );
  215. #if LIBAVCODEC_BUILD >= 4698
  216.     if( val.i_int ) p_sys->p_context->debug_mv = val.i_int;
  217. #endif
  218.     var_Create( p_dec, "ffmpeg-lowres", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
  219.     var_Get( p_dec, "ffmpeg-lowres", &val );
  220. #if LIBAVCODEC_BUILD >= 4723
  221.     if( val.i_int > 0 && val.i_int <= 2 ) p_sys->p_context->lowres = val.i_int;
  222. #endif
  223.     /* ***** ffmpeg frame skipping ***** */
  224.     var_Create( p_dec, "ffmpeg-hurry-up", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  225.     var_Get( p_dec, "ffmpeg-hurry-up", &val );
  226.     p_sys->b_hurry_up = val.b_bool;
  227.     /* ***** ffmpeg direct rendering ***** */
  228.     p_sys->b_direct_rendering = 0;
  229.     var_Create( p_dec, "ffmpeg-dr", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
  230.     var_Get( p_dec, "ffmpeg-dr", &val );
  231.     if( val.b_bool && (p_sys->p_codec->capabilities & CODEC_CAP_DR1) &&
  232.         ffmpeg_PixFmtToChroma( p_sys->p_context->pix_fmt ) &&
  233.         /* Apparently direct rendering doesn't work with YUV422P */
  234.         p_sys->p_context->pix_fmt != PIX_FMT_YUV422P &&
  235.         /* H264 uses too many reference frames */
  236.         p_sys->i_codec_id != CODEC_ID_H264 &&
  237.         !(p_sys->p_context->width % 16) && !(p_sys->p_context->height % 16) &&
  238. #if LIBAVCODEC_BUILD >= 4698
  239.         !p_sys->p_context->debug_mv )
  240. #else
  241.         1 )
  242. #endif
  243.     {
  244.         /* Some codecs set pix_fmt only after the 1st frame has been decoded,
  245.          * so we need to do another check in ffmpeg_GetFrameBuf() */
  246.         p_sys->b_direct_rendering = 1;
  247.     }
  248. #ifdef LIBAVCODEC_PP
  249.     p_sys->p_pp = NULL;
  250.     p_sys->b_pp = p_sys->b_pp_async = p_sys->b_pp_init = VLC_FALSE;
  251.     p_sys->p_pp = E_(OpenPostproc)( p_dec, &p_sys->b_pp_async );
  252. #endif
  253.     /* ffmpeg doesn't properly release old pictures when frames are skipped */
  254.     //if( p_sys->b_hurry_up ) p_sys->b_direct_rendering = 0;
  255.     if( p_sys->b_direct_rendering )
  256.     {
  257.         msg_Dbg( p_dec, "using direct rendering" );
  258.         p_sys->p_context->flags |= CODEC_FLAG_EMU_EDGE;
  259.     }
  260.     /* Always use our get_buffer wrapper so we can calculate the
  261.      * PTS correctly */
  262.     p_sys->p_context->get_buffer = ffmpeg_GetFrameBuf;
  263.     p_sys->p_context->release_buffer = ffmpeg_ReleaseFrameBuf;
  264.     p_sys->p_context->opaque = p_dec;
  265.     /* ***** init this codec with special data ***** */
  266.     if( p_dec->fmt_in.i_extra )
  267.     {
  268.         int i_size = p_dec->fmt_in.i_extra;
  269.         if( p_sys->i_codec_id == CODEC_ID_SVQ3 )
  270.         {
  271.             uint8_t *p;
  272.             p_sys->p_context->extradata_size = i_size + 12;
  273.             p = p_sys->p_context->extradata  =
  274.                 malloc( p_sys->p_context->extradata_size );
  275.             memcpy( &p[0],  "SVQ3", 4 );
  276.             memset( &p[4], 0, 8 );
  277.             memcpy( &p[12], p_dec->fmt_in.p_extra, i_size );
  278.             /* Now remove all atoms before the SMI one */
  279.             if( p_sys->p_context->extradata_size > 0x5a &&
  280.                 strncmp( &p[0x56], "SMI ", 4 ) )
  281.             {
  282.                 uint8_t *psz = &p[0x52];
  283.                 while( psz < &p[p_sys->p_context->extradata_size - 8] )
  284.                 {
  285.                     int i_size = GetDWBE( psz );
  286.                     if( i_size <= 1 )
  287.                     {
  288.                         /* FIXME handle 1 as long size */
  289.                         break;
  290.                     }
  291.                     if( !strncmp( &psz[4], "SMI ", 4 ) )
  292.                     {
  293.                         memmove( &p[0x52], psz,
  294.                                  &p[p_sys->p_context->extradata_size] - psz );
  295.                         break;
  296.                     }
  297.                     psz += i_size;
  298.                 }
  299.             }
  300.         }
  301.         else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'R', 'V', '1', '0' ) ||
  302.                  p_dec->fmt_in.i_codec == VLC_FOURCC( 'R', 'V', '1', '3' ) ||
  303.                  p_dec->fmt_in.i_codec == VLC_FOURCC( 'R', 'V', '2', '0' ) )
  304.         {
  305.             if( p_dec->fmt_in.i_extra == 8 )
  306.             {
  307.                 p_sys->p_context->extradata_size = 8;
  308.                 p_sys->p_context->extradata = malloc( 8 );
  309.                 memcpy( p_sys->p_context->extradata,
  310.                         p_dec->fmt_in.p_extra,
  311.                         p_dec->fmt_in.i_extra );
  312.                 p_sys->p_context->sub_id= ((uint32_t*)p_dec->fmt_in.p_extra)[1];
  313.                 msg_Warn( p_dec, "using extra data for RV codec sub_id=%08x",
  314.                           p_sys->p_context->sub_id );
  315.             }
  316.         }
  317.         /* FIXME: remove when ffmpeg deals properly with avc1 */
  318.         else if( p_dec->fmt_in.i_codec == VLC_FOURCC('a','v','c','1') )
  319.         {
  320.             ;
  321.         }
  322.         /* End FIXME */
  323.         else
  324.         {
  325.             p_sys->p_context->extradata_size = i_size;
  326.             p_sys->p_context->extradata =
  327.                 malloc( i_size + FF_INPUT_BUFFER_PADDING_SIZE );
  328.             memcpy( p_sys->p_context->extradata,
  329.                     p_dec->fmt_in.p_extra, i_size );
  330.             memset( &((uint8_t*)p_sys->p_context->extradata)[i_size],
  331.                     0, FF_INPUT_BUFFER_PADDING_SIZE );
  332.         }
  333.     }
  334.     /* ***** misc init ***** */
  335.     p_sys->input_pts = p_sys->input_dts = 0;
  336.     p_sys->i_pts = 0;
  337.     p_sys->b_has_b_frames = VLC_FALSE;
  338.     p_sys->b_first_frame = VLC_TRUE;
  339.     p_sys->i_late_frames = 0;
  340.     p_sys->i_buffer = 0;
  341.     p_sys->i_buffer_orig = 1;
  342.     p_sys->p_buffer_orig = p_sys->p_buffer = malloc( p_sys->i_buffer_orig );
  343.     /* Set output properties */
  344.     p_dec->fmt_out.i_cat = VIDEO_ES;
  345.     p_dec->fmt_out.i_codec = ffmpeg_PixFmtToChroma( p_context->pix_fmt );
  346.     /* Setup palette */
  347. #if LIBAVCODEC_BUILD >= 4688
  348.     if( p_dec->fmt_in.video.p_palette )
  349.         p_sys->p_context->palctrl =
  350.             (AVPaletteControl *)p_dec->fmt_in.video.p_palette;
  351.     else
  352.         p_sys->p_context->palctrl = &palette_control;
  353. #endif
  354.     /* ***** Open the codec ***** */
  355.     vlc_mutex_lock( lockval.p_address );
  356.     if( avcodec_open( p_sys->p_context, p_sys->p_codec ) < 0 )
  357.     {
  358.         vlc_mutex_unlock( lockval.p_address );
  359.         msg_Err( p_dec, "cannot open codec (%s)", p_sys->psz_namecodec );
  360.         free( p_sys );
  361.         return VLC_EGENERIC;
  362.     }
  363.     vlc_mutex_unlock( lockval.p_address );
  364.     msg_Dbg( p_dec, "ffmpeg codec (%s) started", p_sys->psz_namecodec );
  365.     return VLC_SUCCESS;
  366. }
  367. /*****************************************************************************
  368.  * DecodeVideo: Called to decode one or more frames
  369.  *****************************************************************************/
  370. picture_t *E_(DecodeVideo)( decoder_t *p_dec, block_t **pp_block )
  371. {
  372.     decoder_sys_t *p_sys = p_dec->p_sys;
  373.     int b_drawpicture;
  374.     int b_null_size = VLC_FALSE;
  375.     block_t *p_block;
  376.     if( !pp_block || !*pp_block ) return NULL;
  377.     p_block = *pp_block;
  378.     if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
  379.     {
  380.         p_sys->i_buffer = 0;
  381.         p_sys->i_pts = 0; /* To make sure we recover properly */
  382.         p_sys->input_pts = p_sys->input_dts = 0;
  383.         p_sys->i_late_frames = 0;
  384.         block_Release( p_block );
  385.         return NULL;
  386.     }
  387.     if( !p_dec->b_pace_control && p_sys->i_late_frames > 0 &&
  388.         mdate() - p_sys->i_late_frames_start > I64C(5000000) )
  389.     {
  390.         if( p_sys->i_pts )
  391.         {
  392.             msg_Err( p_dec, "more than 5 seconds of late video -> "
  393.                      "dropping frame (computer too slow ?)" );
  394.             p_sys->i_pts = 0; /* To make sure we recover properly */
  395.         }
  396.         block_Release( p_block );
  397.         p_sys->i_late_frames--;
  398.         return NULL;
  399.     }
  400.     if( p_block->i_pts > 0 || p_block->i_dts > 0 )
  401.     {
  402.         p_sys->input_pts = p_block->i_pts;
  403.         p_sys->input_dts = p_block->i_dts;
  404.         /* Make sure we don't reuse the same timestamps twice */
  405.         p_block->i_pts = p_block->i_dts = 0;
  406.     }
  407.     /* TODO implement it in a better way */
  408.     /* A good idea could be to decode all I pictures and see for the other */
  409.     if( !p_dec->b_pace_control &&
  410.         p_sys->b_hurry_up && p_sys->i_late_frames > 4 )
  411.     {
  412.         b_drawpicture = 0;
  413.         if( p_sys->i_late_frames < 8 )
  414.         {
  415.             p_sys->p_context->hurry_up = 2;
  416.         }
  417.         else
  418.         {
  419.             /* picture too late, won't decode
  420.              * but break picture until a new I, and for mpeg4 ...*/
  421.             p_sys->i_late_frames--; /* needed else it will never be decrease */
  422.             block_Release( p_block );
  423.             p_sys->i_buffer = 0;
  424.             return NULL;
  425.         }
  426.     }
  427.     else
  428.     {
  429.         b_drawpicture = 1;
  430.         p_sys->p_context->hurry_up = 0;
  431.     }
  432.     if( p_sys->p_context->width <= 0 || p_sys->p_context->height <= 0 )
  433.     {
  434.         p_sys->p_context->hurry_up = 5;
  435.         b_null_size = VLC_TRUE;
  436.     }
  437.     /*
  438.      * Do the actual decoding now
  439.      */
  440.     /* Check if post-processing was enabled */
  441.     p_sys->b_pp = p_sys->b_pp_async;
  442.     /* Don't forget that ffmpeg requires a little more bytes
  443.      * that the real frame size */
  444.     if( p_block->i_buffer > 0 )
  445.     {
  446.         p_sys->i_buffer = p_block->i_buffer;
  447.         if( p_sys->i_buffer + FF_INPUT_BUFFER_PADDING_SIZE >
  448.             p_sys->i_buffer_orig )
  449.         {
  450.             free( p_sys->p_buffer_orig );
  451.             p_sys->i_buffer_orig =
  452.                 p_block->i_buffer + FF_INPUT_BUFFER_PADDING_SIZE;
  453.             p_sys->p_buffer_orig = malloc( p_sys->i_buffer_orig );
  454.         }
  455.         p_sys->p_buffer = p_sys->p_buffer_orig;
  456.         p_sys->i_buffer = p_block->i_buffer;
  457.         p_dec->p_vlc->pf_memcpy( p_sys->p_buffer, p_block->p_buffer,
  458.                                  p_block->i_buffer );
  459.         memset( p_sys->p_buffer + p_block->i_buffer, 0,
  460.                 FF_INPUT_BUFFER_PADDING_SIZE );
  461.         p_block->i_buffer = 0;
  462.     }
  463.     while( p_sys->i_buffer > 0 )
  464.     {
  465.         int i_used, b_gotpicture;
  466.         picture_t *p_pic;
  467.         i_used = avcodec_decode_video( p_sys->p_context, p_sys->p_ff_pic,
  468.                                        &b_gotpicture,
  469.                                        p_sys->p_buffer, p_sys->i_buffer );
  470.         if( b_null_size && p_sys->p_context->width > 0 &&
  471.             p_sys->p_context->height > 0 )
  472.         {
  473.             /* Reparse it to not drop the I frame */
  474.             b_null_size = VLC_FALSE;
  475.             p_sys->p_context->hurry_up = 0;
  476.             i_used = avcodec_decode_video( p_sys->p_context, p_sys->p_ff_pic,
  477.                                            &b_gotpicture,
  478.                                            p_sys->p_buffer, p_sys->i_buffer );
  479.         }
  480.         if( i_used < 0 )
  481.         {
  482.             msg_Warn( p_dec, "cannot decode one frame (%d bytes)",
  483.                       p_sys->i_buffer );
  484.             block_Release( p_block );
  485.             return NULL;
  486.         }
  487.         else if( i_used > p_sys->i_buffer )
  488.         {
  489.             i_used = p_sys->i_buffer;
  490.         }
  491.         /* Consumed bytes */
  492.         p_sys->i_buffer -= i_used;
  493.         p_sys->p_buffer += i_used;
  494.         /* Nothing to display */
  495.         if( !b_gotpicture )
  496.         {
  497.             if( i_used == 0 ) break;
  498.             continue;
  499.         }
  500.         /* Update frame late count*/
  501.         if( p_sys->i_pts && p_sys->i_pts <= mdate() )
  502.         {
  503.             p_sys->i_late_frames++;
  504.             if( p_sys->i_late_frames == 1 )
  505.                 p_sys->i_late_frames_start = mdate();
  506.         }
  507.         else
  508.         {
  509.             p_sys->i_late_frames = 0;
  510.         }
  511.         if( !b_drawpicture || !p_sys->p_ff_pic->linesize[0] )
  512.         {
  513.             /* Do not display the picture */
  514.             continue;
  515.         }
  516.         if( !p_sys->p_ff_pic->opaque )
  517.         {
  518.             /* Get a new picture */
  519.             p_pic = ffmpeg_NewPictBuf( p_dec, p_sys->p_context );
  520.             if( !p_pic )
  521.             {
  522.                 block_Release( p_block );
  523.                 return NULL;
  524.             }
  525.             /* Fill p_picture_t from AVVideoFrame and do chroma conversion
  526.              * if needed */
  527.             ffmpeg_CopyPicture( p_dec, p_pic, p_sys->p_ff_pic );
  528.         }
  529.         else
  530.         {
  531.             p_pic = (picture_t *)p_sys->p_ff_pic->opaque;
  532.         }
  533.         /* Set the PTS */
  534.         if( p_sys->p_ff_pic->pts ) p_sys->i_pts = p_sys->p_ff_pic->pts;
  535.         /* Sanity check (seems to be needed for some streams ) */
  536.         if( p_sys->p_ff_pic->pict_type == FF_B_TYPE )
  537.         {
  538.             p_sys->b_has_b_frames = VLC_TRUE;
  539.         }
  540.         /* Send decoded frame to vout */
  541.         if( p_sys->i_pts )
  542.         {
  543.             p_pic->date = p_sys->i_pts;
  544.             /* interpolate the next PTS */
  545.             if( p_sys->p_context->frame_rate > 0 )
  546.             {
  547.                 p_sys->i_pts += I64C(1000000) *
  548.                     (2 + p_sys->p_ff_pic->repeat_pict) *
  549.                     p_sys->p_context->frame_rate_base /
  550.                     (2 * p_sys->p_context->frame_rate);
  551.             }
  552.             if( p_sys->b_first_frame )
  553.             {
  554.                 /* Hack to force display of still pictures */
  555.                 p_sys->b_first_frame = VLC_FALSE;
  556.                 p_pic->b_force = VLC_TRUE;
  557.             }
  558.             p_pic->i_nb_fields = 2 + p_sys->p_ff_pic->repeat_pict;
  559. #if LIBAVCODEC_BUILD >= 4685
  560.             p_pic->b_progressive = !p_sys->p_ff_pic->interlaced_frame;
  561.             p_pic->b_top_field_first = p_sys->p_ff_pic->top_field_first;
  562. #endif
  563.             return p_pic;
  564.         }
  565.         else
  566.         {
  567.             p_dec->pf_vout_buffer_del( p_dec, p_pic );
  568.         }
  569.     }
  570.     block_Release( p_block );
  571.     return NULL;
  572. }
  573. /*****************************************************************************
  574.  * EndVideo: decoder destruction
  575.  *****************************************************************************
  576.  * This function is called when the thread ends after a sucessful
  577.  * initialization.
  578.  *****************************************************************************/
  579. void E_(EndVideoDec)( decoder_t *p_dec )
  580. {
  581.     decoder_sys_t *p_sys = p_dec->p_sys;
  582.     if( p_sys->p_ff_pic ) av_free( p_sys->p_ff_pic );
  583. #ifdef LIBAVCODEC_PP
  584.     E_(ClosePostproc)( p_dec, p_sys->p_pp );
  585. #endif
  586.     free( p_sys->p_buffer_orig );
  587. }
  588. /*****************************************************************************
  589.  * ffmpeg_CopyPicture: copy a picture from ffmpeg internal buffers to a
  590.  *                     picture_t structure (when not in direct rendering mode).
  591.  *****************************************************************************/
  592. static void ffmpeg_CopyPicture( decoder_t *p_dec,
  593.                                 picture_t *p_pic, AVFrame *p_ff_pic )
  594. {
  595.     decoder_sys_t *p_sys = p_dec->p_sys;
  596.     if( ffmpeg_PixFmtToChroma( p_sys->p_context->pix_fmt ) )
  597.     {
  598.         int i_plane, i_size, i_line;
  599.         uint8_t *p_dst, *p_src;
  600.         int i_src_stride, i_dst_stride;
  601. #ifdef LIBAVCODEC_PP
  602.         if( p_sys->p_pp && p_sys->b_pp )
  603.             E_(PostprocPict)( p_dec, p_sys->p_pp, p_pic, p_ff_pic );
  604.         else
  605. #endif
  606.         for( i_plane = 0; i_plane < p_pic->i_planes; i_plane++ )
  607.         {
  608.             p_src  = p_ff_pic->data[i_plane];
  609.             p_dst = p_pic->p[i_plane].p_pixels;
  610.             i_src_stride = p_ff_pic->linesize[i_plane];
  611.             i_dst_stride = p_pic->p[i_plane].i_pitch;
  612.             i_size = __MIN( i_src_stride, i_dst_stride );
  613.             for( i_line = 0; i_line < p_pic->p[i_plane].i_visible_lines;
  614.                  i_line++ )
  615.             {
  616.                 p_dec->p_vlc->pf_memcpy( p_dst, p_src, i_size );
  617.                 p_src += i_src_stride;
  618.                 p_dst += i_dst_stride;
  619.             }
  620.         }
  621.     }
  622.     else
  623.     {
  624.         AVPicture dest_pic;
  625.         int i;
  626.         /* we need to convert to I420 */
  627.         switch( p_sys->p_context->pix_fmt )
  628.         {
  629.         case PIX_FMT_YUV410P:
  630.         case PIX_FMT_YUV411P:
  631.         case PIX_FMT_PAL8:
  632.             for( i = 0; i < p_pic->i_planes; i++ )
  633.             {
  634.                 dest_pic.data[i] = p_pic->p[i].p_pixels;
  635.                 dest_pic.linesize[i] = p_pic->p[i].i_pitch;
  636.             }
  637.             img_convert( &dest_pic, PIX_FMT_YUV420P,
  638.                          (AVPicture *)p_ff_pic,
  639.                          p_sys->p_context->pix_fmt,
  640.                          p_sys->p_context->width,
  641.                          p_sys->p_context->height );
  642.             break;
  643.         default:
  644.             msg_Err( p_dec, "don't know how to convert chroma %i",
  645.                      p_sys->p_context->pix_fmt );
  646.             p_dec->b_error = 1;
  647.             break;
  648.         }
  649.     }
  650. }
  651. /*****************************************************************************
  652.  * ffmpeg_GetFrameBuf: callback used by ffmpeg to get a frame buffer.
  653.  *****************************************************************************
  654.  * It is used for direct rendering as well as to get the right PTS for each
  655.  * decoded picture (even in indirect rendering mode).
  656.  *****************************************************************************/
  657. static int ffmpeg_GetFrameBuf( struct AVCodecContext *p_context,
  658.                                AVFrame *p_ff_pic )
  659. {
  660.     decoder_t *p_dec = (decoder_t *)p_context->opaque;
  661.     decoder_sys_t *p_sys = p_dec->p_sys;
  662.     picture_t *p_pic;
  663.     /* Set picture PTS */
  664.     if( p_sys->input_pts )
  665.     {
  666.         p_ff_pic->pts = p_sys->input_pts;
  667.     }
  668.     else if( p_sys->input_dts )
  669.     {
  670.         /* Some demuxers only set the dts so let's try to find a useful
  671.          * timestamp from this */
  672.         if( !p_context->has_b_frames || !p_sys->b_has_b_frames ||
  673.             !p_ff_pic->reference || !p_sys->i_pts )
  674.         {
  675.             p_ff_pic->pts = p_sys->input_dts;
  676.         }
  677.         else p_ff_pic->pts = 0;
  678.     }
  679.     else p_ff_pic->pts = 0;
  680.     if( p_sys->i_pts ) /* make sure 1st frame has a pts > 0 */
  681.     {
  682.         p_sys->input_pts = p_sys->input_dts = 0;
  683.     }
  684.     p_ff_pic->opaque = 0;
  685.     /* Not much to do in indirect rendering mode */
  686.     if( !p_sys->b_direct_rendering || p_sys->b_pp )
  687.     {
  688.         return avcodec_default_get_buffer( p_context, p_ff_pic );
  689.     }
  690.     /* Some codecs set pix_fmt only after the 1st frame has been decoded,
  691.      * so this check is necessary. */
  692.     if( !ffmpeg_PixFmtToChroma( p_context->pix_fmt ) ||
  693.         p_sys->p_context->width % 16 || p_sys->p_context->height % 16 )
  694.     {
  695.         msg_Dbg( p_dec, "disabling direct rendering" );
  696.         p_sys->b_direct_rendering = 0;
  697.         return avcodec_default_get_buffer( p_context, p_ff_pic );
  698.     }
  699.     /* Get a new picture */
  700.     //p_sys->p_vout->render.b_allow_modify_pics = 0;
  701.     p_pic = ffmpeg_NewPictBuf( p_dec, p_sys->p_context );
  702.     if( !p_pic )
  703.     {
  704.         p_sys->b_direct_rendering = 0;
  705.         return avcodec_default_get_buffer( p_context, p_ff_pic );
  706.     }
  707.     p_sys->p_context->draw_horiz_band = NULL;
  708.     p_ff_pic->opaque = (void*)p_pic;
  709.     p_ff_pic->type = FF_BUFFER_TYPE_USER;
  710.     p_ff_pic->data[0] = p_pic->p[0].p_pixels;
  711.     p_ff_pic->data[1] = p_pic->p[1].p_pixels;
  712.     p_ff_pic->data[2] = p_pic->p[2].p_pixels;
  713.     p_ff_pic->data[3] = NULL; /* alpha channel but I'm not sure */
  714.     p_ff_pic->linesize[0] = p_pic->p[0].i_pitch;
  715.     p_ff_pic->linesize[1] = p_pic->p[1].i_pitch;
  716.     p_ff_pic->linesize[2] = p_pic->p[2].i_pitch;
  717.     p_ff_pic->linesize[3] = 0;
  718.     if( p_ff_pic->reference != 0 )
  719.     {
  720.         p_dec->pf_picture_link( p_dec, p_pic );
  721.     }
  722.     /* FIXME what is that, should give good value */
  723.     p_ff_pic->age = 256*256*256*64; // FIXME FIXME from ffmpeg
  724.     return 0;
  725. }
  726. static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *p_context,
  727.                                     AVFrame *p_ff_pic )
  728. {
  729.     decoder_t *p_dec = (decoder_t *)p_context->opaque;
  730.     picture_t *p_pic;
  731.     if( !p_ff_pic->opaque )
  732.     {
  733.         avcodec_default_release_buffer( p_context, p_ff_pic );
  734.         return;
  735.     }
  736.     p_pic = (picture_t*)p_ff_pic->opaque;
  737.     p_ff_pic->data[0] = NULL;
  738.     p_ff_pic->data[1] = NULL;
  739.     p_ff_pic->data[2] = NULL;
  740.     p_ff_pic->data[3] = NULL;
  741.     if( p_ff_pic->reference != 0 )
  742.     {
  743.         p_dec->pf_picture_unlink( p_dec, p_pic );
  744.     }
  745. }