Improve error handling.
This commit is contained in:
@@ -134,6 +134,30 @@ MovieTexture_AVCodec::MovieTexture_AVCodec( RageTextureID ID ):
|
|||||||
CreateFrameRects();
|
CreateFrameRects();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CString averr_ssprintf( int err, const char *fmt, ... )
|
||||||
|
{
|
||||||
|
ASSERT( err < 0 );
|
||||||
|
|
||||||
|
va_list va;
|
||||||
|
va_start(va, fmt);
|
||||||
|
CString s = vssprintf( fmt, va );
|
||||||
|
va_end(va);
|
||||||
|
|
||||||
|
CString Error;
|
||||||
|
switch( err )
|
||||||
|
{
|
||||||
|
case AVERROR_IO: Error = "I/O error"; break;
|
||||||
|
case AVERROR_NUMEXPECTED: Error = "number syntax expected in filename"; break;
|
||||||
|
case AVERROR_INVALIDDATA: Error = "invalid data found"; break;
|
||||||
|
case AVERROR_NOMEM: Error = "not enough memory"; break;
|
||||||
|
case AVERROR_NOFMT: Error = "unknown format"; break;
|
||||||
|
case AVERROR_UNKNOWN: Error = "unknown error"; break;
|
||||||
|
default: Error = ssprintf( "unknown error %i", err ); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s + " (" + Error + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void MovieTexture_AVCodec::Create()
|
void MovieTexture_AVCodec::Create()
|
||||||
@@ -149,23 +173,23 @@ void MovieTexture_AVCodec::Create()
|
|||||||
avcodec::av_register_all();
|
avcodec::av_register_all();
|
||||||
int ret = av_open_input_file( &m_fctx, actualID.filename, NULL, 0, NULL );
|
int ret = av_open_input_file( &m_fctx, actualID.filename, NULL, 0, NULL );
|
||||||
if( ret < 0 )
|
if( ret < 0 )
|
||||||
RageException::Throw("AVCodec: Couldn't open \"%s\" (%i)", ret); /* XXX */
|
RageException::Throw( averr_ssprintf(ret, "AVCodec: Couldn't open \"%s\"", actualID.filename.c_str()) );
|
||||||
|
|
||||||
ret = av_find_stream_info( m_fctx );
|
ret = av_find_stream_info( m_fctx );
|
||||||
if ( ret < 0 )
|
if ( ret < 0 )
|
||||||
RageException::Throw("AVCodec: Couldn't find codec parameters"); /* XXX */
|
RageException::Throw( averr_ssprintf(ret, "AVCodec: Couldn't find codec parameters") );
|
||||||
|
|
||||||
m_stream = FindVideoStream( m_fctx );
|
m_stream = FindVideoStream( m_fctx );
|
||||||
if ( m_stream == NULL )
|
if ( m_stream == NULL )
|
||||||
RageException::Throw("AVCodec: Couldn't find video stream"); /* XXX */
|
RageException::Throw( averr_ssprintf(ret, "AVCodec: Couldn't find video stream") );
|
||||||
|
|
||||||
m_codec = avcodec_find_decoder( m_stream->codec.codec_id );
|
m_codec = avcodec_find_decoder( m_stream->codec.codec_id );
|
||||||
if( m_codec == NULL )
|
if( m_codec == NULL )
|
||||||
RageException::Throw("AVCodec: Couldn't find decoder"); /* XXX */
|
RageException::Throw( averr_ssprintf(ret, "AVCodec: Couldn't find decoder") );
|
||||||
|
|
||||||
ret = avcodec_open( &m_stream->codec, m_codec );
|
ret = avcodec_open( &m_stream->codec, m_codec );
|
||||||
if ( ret < 0 )
|
if ( ret < 0 )
|
||||||
RageException::Throw("AVCodec: Couldn't open decoder (%i)", ret ); /* XXX */
|
RageException::Throw( averr_ssprintf(ret, "AVCodec: Couldn't open decoder (%i)") );
|
||||||
|
|
||||||
/* I think avcodec wants a special case for this (no decoding); I don't
|
/* I think avcodec wants a special case for this (no decoding); I don't
|
||||||
* want to bother. XXX: test and see if this is really needed */
|
* want to bother. XXX: test and see if this is really needed */
|
||||||
@@ -247,7 +271,9 @@ void MovieTexture_AVCodec::CreateTexture()
|
|||||||
* TODO: We could get a big speed bonus by doing the above if the
|
* TODO: We could get a big speed bonus by doing the above if the
|
||||||
* hardware renderer can handle YUV textures. I think D3D can do
|
* hardware renderer can handle YUV textures. I think D3D can do
|
||||||
* this, as well as OpenGL on the Mac, but we don't have any infrastructure
|
* this, as well as OpenGL on the Mac, but we don't have any infrastructure
|
||||||
* for this right now. */
|
* for this right now.
|
||||||
|
*
|
||||||
|
* A hint: http://oss.sgi.com/projects/performer/mail/info-performer/perf-01-06/0017.html */
|
||||||
PixelFormat pixfmt;
|
PixelFormat pixfmt;
|
||||||
bool PreferHighColor = (TEXTUREMAN->GetMovieColorDepth() == 32);
|
bool PreferHighColor = (TEXTUREMAN->GetMovieColorDepth() == 32);
|
||||||
m_AVTexfmt = FindCompatibleAVFormat( pixfmt, PreferHighColor );
|
m_AVTexfmt = FindCompatibleAVFormat( pixfmt, PreferHighColor );
|
||||||
|
|||||||
Reference in New Issue
Block a user