From d68d03ca93b9a991cc49c32dc170862b472dfdee Mon Sep 17 00:00:00 2001 From: tobigun Date: Fri, 7 Mar 2008 20:31:37 +0000 Subject: - Fixed audio-playing in container (video) files. Now audio can be read directly from the video file and does not have to be extracted to a separate audio-file anymore (tested with vob, avi and flv. Note: With some versions of FFMPEG flv does not work correctly). - Added "pCodecCtx^.workaround_bugs := FF_BUG_AUTODETECT" to let FFMPEG automatically handle known bugs. This might be interesting for video-decoding too. git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@936 b956fd51-792f-4845-bead-9b4dfca2ff2c --- Game/Code/Classes/UAudioDecoder_FFMpeg.pas | 44 ++++++++++++++++++++++-------- Game/Code/Classes/UMusic.pas | 4 +-- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/Game/Code/Classes/UAudioDecoder_FFMpeg.pas b/Game/Code/Classes/UAudioDecoder_FFMpeg.pas index 18d6c03b..e692df6f 100644 --- a/Game/Code/Classes/UAudioDecoder_FFMpeg.pas +++ b/Game/Code/Classes/UAudioDecoder_FFMpeg.pas @@ -110,7 +110,7 @@ type audio_buf : TAudioBuffer; procedure Lock(); {$IFDEF HasInline}inline;{$ENDIF} - procedure Unlock(); {$IFDEF HasInline}inline;{$ENDIF} + procedure Unlock(); {$IFDEF HasInline}inline;{$ENDIF} function GetLockMutex(): PSDL_Mutex; {$IFDEF HasInline}inline;{$ENDIF} procedure ParseAudio(); @@ -119,7 +119,7 @@ type public constructor Create(pFormatCtx: PAVFormatContext; pCodecCtx: PAVCodecContext; pCodec: PAVCodec; - ffmpegStreamID : Integer; ffmpegStream: PAVStream); + ffmpegStreamIndex: Integer; ffmpegStream: PAVStream); destructor Destroy(); override; procedure Close(); override; @@ -154,7 +154,7 @@ var constructor TFFMpegDecodeStream.Create(pFormatCtx: PAVFormatContext; pCodecCtx: PAVCodecContext; pCodec: PAVCodec; - ffmpegStreamID : Integer; ffmpegStream: PAVStream); + ffmpegStreamIndex : Integer; ffmpegStream: PAVStream); begin inherited Create(); @@ -229,14 +229,14 @@ begin end; procedure TFFMpegDecodeStream.Lock(); -begin - SDL_mutexP(internalLock); -end; - -procedure TFFMpegDecodeStream.Unlock(); -begin - SDL_mutexV(internalLock); -end; +begin + SDL_mutexP(internalLock); +end; + +procedure TFFMpegDecodeStream.Unlock(); +begin + SDL_mutexV(internalLock); +end; function TFFMpegDecodeStream.GetLockMutex(): PSDL_Mutex; begin @@ -634,6 +634,7 @@ begin {$ENDIF} ffmpegStreamID := FindAudioStreamIndex(pFormatCtx); + //Writeln('ID: ' + inttostr(ffmpegStreamID)); if (ffmpegStreamID < 0) then exit; @@ -649,7 +650,26 @@ begin exit; end; - avcodec_open(pCodecCtx, pCodec); + // set debug options + pCodecCtx^.debug_mv := 0; + pCodecCtx^.debug := 0; + + // detect bug-workarounds automatically + pCodecCtx^.workaround_bugs := FF_BUG_AUTODETECT; + + // TODO: Not sure if these fields are for audio too + //pCodecCtx^.lowres := lowres; + //if (fast) then pCodecCtx^.flags2 := pCodecCtx^.flags2 or CODEC_FLAG2_FAST; + //pCodecCtx^.skip_frame := skip_frame; + //pCodecCtx^.skip_loop_filter := skip_loop_filter; + //pCodecCtx^.error_resilience := error_resilience; + //pCodecCtx^.error_concealment := error_concealment; + + if (avcodec_open(pCodecCtx, pCodec) < 0) then + begin + Log.LogStatus('avcodec_open failed!', 'UAudio_FFMpeg'); + exit; + end; //WriteLn( 'Opened the codec' ); stream := TFFMpegDecodeStream.Create(pFormatCtx, pCodecCtx, pCodec, diff --git a/Game/Code/Classes/UMusic.pas b/Game/Code/Classes/UMusic.pas index 699cfa23..e2538c9d 100644 --- a/Game/Code/Classes/UMusic.pas +++ b/Game/Code/Classes/UMusic.pas @@ -89,10 +89,10 @@ type const FFTSize = 512; // size of FFT data (output: FFTSize/2 values) type - TFFTData = array[0..(FFTSize div 2-1)] of Single; + TFFTData = array[0..(FFTSize div 2)-1] of Single; type - TPCMStereoSample = array[0..1] of Smallint; + TPCMStereoSample = array[0..1] of SmallInt; TPCMData = array[0..511] of TPCMStereoSample; type -- cgit v1.2.3