Commit 3dd66e38 authored by Laurent Aimar's avatar Laurent Aimar

* ffmpeg : add a new option, it set the level of error resilience.

It allows to play mpeg4 file badly encoded(illegal VLC code).(Sam you
should be able to play your .mp4 file by setting it to -1, with recent
ffmpeg cvs).
parent bf9b62a4
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* ffmpeg.c: video decoder using ffmpeg library * ffmpeg.c: video decoder using ffmpeg library
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * Copyright (C) 1999-2001 VideoLAN
* $Id: ffmpeg.c,v 1.16 2002/07/20 18:01:42 sam Exp $ * $Id: ffmpeg.c,v 1.17 2002/07/20 18:53:33 fenrir Exp $
* *
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
...@@ -71,11 +71,33 @@ void _M( vdec_getfunctions )( function_list_t * p_function_list ) ...@@ -71,11 +71,33 @@ void _M( vdec_getfunctions )( function_list_t * p_function_list )
* Build configuration tree. * Build configuration tree.
*****************************************************************************/ *****************************************************************************/
#define ERROR_RESILIENCE_LONGTEXT \
"ffmpeg can make errors resiliences. \n"\
"Nevertheless, with buggy encoder (like ISO MPEG-4 encoder from M$) " \
"this will produce a lot of errors.\n" \
"Valid range is -1 to 99 (-1 disable all errors resiliences)."
#define HURRY_UP_LONGTEXT \
"Allow the decoder to partially decode or skip frame(s) " \
"when there not enough time.\n It's usefull with low CPU power " \
"but it could produce broken pictures (not yet implemented)"
MODULE_CONFIG_START MODULE_CONFIG_START
ADD_CATEGORY_HINT( N_("Miscellaneous"), NULL )
#if LIBAVCODEC_BUILD >= 4611
ADD_INTEGER ( "ffmpeg-error-resilience", 0, NULL,
"error resilience", ERROR_RESILIENCE_LONGTEXT )
ADD_INTEGER ( "ffmpeg-workaround-bugs", 0, NULL,
"workaround bugs", "0-99, seems to be for msmpeg v3\n" )
#endif
#if LIBAVCODEC_BUILD > 4603
ADD_BOOL( "ffmpeg-hurry-up", 0, NULL, "hurry up", HURRY_UP_LONGTEXT )
#endif
MODULE_CONFIG_STOP MODULE_CONFIG_STOP
MODULE_INIT_START MODULE_INIT_START
SET_DESCRIPTION( "ffmpeg video decoder (MS-MPEG4,MPEG4,SVQ1,H263,H263.I)" ) SET_DESCRIPTION( "ffmpeg video decoder(MS-MPEG4,MPEG4,SVQ1,H263,H263.I)" )
ADD_CAPABILITY( DECODER, 70 ) ADD_CAPABILITY( DECODER, 70 )
MODULE_INIT_STOP MODULE_INIT_STOP
...@@ -87,7 +109,6 @@ MODULE_DEACTIVATE_START ...@@ -87,7 +109,6 @@ MODULE_DEACTIVATE_START
MODULE_DEACTIVATE_STOP MODULE_DEACTIVATE_STOP
/***************************************************************************** /*****************************************************************************
* decoder_Probe: probe the decoder and return score * decoder_Probe: probe the decoder and return score
***************************************************************************** *****************************************************************************
...@@ -264,7 +285,7 @@ static inline void __NextFrame( videodec_thread_t *p_vdec ) ...@@ -264,7 +285,7 @@ static inline void __NextFrame( videodec_thread_t *p_vdec )
__PES_NEXT( p_vdec->p_fifo ); __PES_NEXT( p_vdec->p_fifo );
} }
/* FIXME FIXME some of them may be wrong */ /* FIXME FIXME some of them are wrong */
static int i_ffmpeg_PixFmtToChroma[] = static int i_ffmpeg_PixFmtToChroma[] =
{ {
/* PIX_FMT_ANY = -1,PIX_FMT_YUV420P, PIX_FMT_YUV422, /* PIX_FMT_ANY = -1,PIX_FMT_YUV420P, PIX_FMT_YUV422,
...@@ -654,6 +675,7 @@ static void ffmpeg_ConvertPicture( picture_t *p_pic, ...@@ -654,6 +675,7 @@ static void ffmpeg_ConvertPicture( picture_t *p_pic,
static int InitThread( videodec_thread_t *p_vdec ) static int InitThread( videodec_thread_t *p_vdec )
{ {
int i_ffmpeg_codec; int i_ffmpeg_codec;
int i_tmp;
if( p_vdec->p_fifo->p_demux_data ) if( p_vdec->p_fifo->p_demux_data )
{ {
...@@ -696,12 +718,33 @@ static int InitThread( videodec_thread_t *p_vdec ) ...@@ -696,12 +718,33 @@ static int InitThread( videodec_thread_t *p_vdec )
p_vdec->p_context->width = p_vdec->format.i_width; p_vdec->p_context->width = p_vdec->format.i_width;
p_vdec->p_context->height = p_vdec->format.i_height; p_vdec->p_context->height = p_vdec->format.i_height;
/* XXX see them and search what that means /* XXX
p_vdec->p_context->workaround_bugs p_vdec->p_context->workaround_bugs
--> seems to be for msmpeg 3 but can't know what is supposed to do
p_vdec->p_context->strict_std_compliance p_vdec->p_context->strict_std_compliance
--> strictly follow mpeg4 standard for decoder or encoder ??
p_vdec->p_context->error_resilience
--> don't make error resilience, because of some ms encoder witch
use some wrong VLC code.
*/ */
if (avcodec_open(p_vdec->p_context, p_vdec->p_codec) < 0) #if LIBAVCODEC_BUILD >= 4611
i_tmp = config_GetInt( p_vdec->p_fifo, "ffmpeg-workaround-bugs" );
p_vdec->p_context->workaround_bugs = __MAX( __MIN( i_tmp, 99 ), 0 );
i_tmp = config_GetInt( p_vdec->p_fifo, "ffmpeg-error-resilience" );
p_vdec->p_context->error_resilience = __MAX( __MIN( i_tmp, 99 ), -1 );
#endif
#if LIBAVCODEC_BUILD >= 4614
if( config_GetInt( p_vdec->p_fifo, "grayscale" ) )
{
p_vdec->p_context->flags|= CODEC_FLAG_GRAY;
}
#endif
if (avcodec_open(p_vdec->p_context, p_vdec->p_codec) < 0)
{ {
msg_Err( p_vdec->p_fifo, "cannot open codec (%s)", msg_Err( p_vdec->p_fifo, "cannot open codec (%s)",
p_vdec->psz_namecodec ); p_vdec->psz_namecodec );
...@@ -746,6 +789,7 @@ static void DecodeThread( videodec_thread_t *p_vdec ) ...@@ -746,6 +789,7 @@ static void DecodeThread( videodec_thread_t *p_vdec )
{ {
msg_Warn( p_vdec->p_fifo, "cannot decode one frame (%d bytes)", msg_Warn( p_vdec->p_fifo, "cannot decode one frame (%d bytes)",
p_vdec->i_framesize ); p_vdec->i_framesize );
p_vdec->i_frame_error++;
return; return;
} }
if( !b_gotpicture || avpicture.linesize[0] == 0 ) if( !b_gotpicture || avpicture.linesize[0] == 0 )
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* ffmpeg_vdec.h: video decoder using ffmpeg library * ffmpeg_vdec.h: video decoder using ffmpeg library
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: ffmpeg.h,v 1.4 2002/07/15 19:33:02 fenrir Exp $ * $Id: ffmpeg.h,v 1.5 2002/07/20 18:53:33 fenrir Exp $
* *
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
...@@ -103,4 +103,8 @@ typedef struct videodec_thread_s ...@@ -103,4 +103,8 @@ typedef struct videodec_thread_s
mtime_t i_pts; mtime_t i_pts;
int i_framesize; int i_framesize;
byte_t *p_framedata; byte_t *p_framedata;
int i_frame_error;
int i_frame_skip;
} videodec_thread_t; } videodec_thread_t;
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment