diff --git a/src/bink.c b/src/bink.c index 1e0ab77..7b86e02 100644 --- a/src/bink.c +++ b/src/bink.c @@ -1,40 +1,27 @@ +#include "bink.h" + #include #include #include -#include "fixer.h" - -#include "bink.h" #include -#include #include +#include +#include +#include +#include +#include -#include "libavcodec/avcodec.h" -#include "libavformat/avformat.h" -#include "libavutil/avutil.h" -#include "libavutil/imgutils.h" -#include "libavutil/channel_layout.h" -#include "libswscale/swscale.h" - - -//#define DISABLE_MOVIES -//#define DISABLE_MUSIC -//#define DISABLE_FMVS - -extern void SDL_Delay(); -extern uint SDL_GetTicks(); extern int SoundSys_IsOn(); extern void DrawAvpMenuBink(char* buf, int width, int height, int pitch); extern float PlatVolumeToGain(int volume); - //#define AL_CHECK() { int err = alGetError(); if(err!=AL_NO_ERROR) printf("%s:%d ALError %04x\n", __FILE__, __LINE__, err); } #define AL_CHECK() {} #define FRAMEQUEUESIZE 4 -struct binkMovie -{ +struct binkMovie { AVFormatContext* avContext; AVPacket packet; @@ -60,22 +47,16 @@ struct binkMovie ALuint alFreeBuffers[FRAMEQUEUESIZE]; ALuint alNumFreeBuffers; ALuint alNumChannels; - ALenum alFormat; + ALenum alFormat; ALuint alSampleRate; uint timeStart; - BOOL looping; - BOOL isfmv; }; - -//----------------------------------------------------------------------------------------------- - static void BinkRenderMovie(struct binkMovie* aMovie) { - if(aMovie && aMovie->videoFrame && aMovie->videoScalePicture[0]) - { + if (aMovie && aMovie->videoFrame && aMovie->videoScalePicture[0]) { DrawAvpMenuBink( aMovie->videoScalePicture[0], aMovie->videoFrame->width, @@ -84,7 +65,6 @@ static void BinkRenderMovie(struct binkMovie* aMovie) } } - static void BinkInitMovieStruct(struct binkMovie* aMovie) { *aMovie = (struct binkMovie){ @@ -96,28 +76,26 @@ static void BinkInitMovieStruct(struct binkMovie* aMovie) static void BinkReleaseMovie(struct binkMovie* aMovie) { - if(aMovie->alInited) - { + if (aMovie->alInited) { alSourceStop(aMovie->alSource); alDeleteSources(1, &aMovie->alSource); alDeleteBuffers(FRAMEQUEUESIZE, aMovie->alBuffers); - if(aMovie->audioTempBuffer) + if (aMovie->audioTempBuffer) free(aMovie->audioTempBuffer); } - if(aMovie->videoScaleContext) - av_freep(&aMovie->videoScalePicture[0]); - - if(aMovie->avContext) + if (aMovie->avContext) avformat_close_input(&aMovie->avContext); - if(aMovie->audioCodecContext) + if (aMovie->audioCodecContext) avcodec_free_context(&aMovie->audioCodecContext); - if(aMovie->audioFrame) + if (aMovie->audioFrame) av_frame_free(&aMovie->audioFrame); - if(aMovie->videoCodecContext) + if (aMovie->videoCodecContext) avcodec_free_context(&aMovie->videoCodecContext); - if(aMovie->videoFrame) + if (aMovie->videoFrame) av_frame_free(&aMovie->videoFrame); + if (aMovie->videoScaleContext) + av_freep(&aMovie->videoScalePicture[0]); BinkInitMovieStruct(aMovie); } @@ -125,15 +103,16 @@ static void BinkReleaseMovie(struct binkMovie* aMovie) static int DecodeVideoFrame(struct binkMovie* aMovie) { - int ret = avcodec_receive_frame(aMovie->videoCodecContext, aMovie->videoFrame); - if (ret < 0) + if (avcodec_receive_frame(aMovie->videoCodecContext, aMovie->videoFrame) != 0) return 0; - if(aMovie->videoScaleContext==NULL) - { - if(aMovie->videoScaleWidth==0) aMovie->videoScaleWidth = aMovie->videoFrame->width; - if(aMovie->videoScaleHeight==0) aMovie->videoScaleHeight = aMovie->videoFrame->height; - if(aMovie->videoScaleFormat==AV_PIX_FMT_NONE) aMovie->videoScaleFormat = AV_PIX_FMT_RGB565; + if (aMovie->videoScaleContext == NULL) { + if (aMovie->videoScaleWidth == 0) + aMovie->videoScaleWidth = aMovie->videoFrame->width; + if (aMovie->videoScaleHeight == 0) + aMovie->videoScaleHeight = aMovie->videoFrame->height; + if (aMovie->videoScaleFormat == AV_PIX_FMT_NONE) + aMovie->videoScaleFormat = AV_PIX_FMT_RGB565; aMovie->videoScaleContext = sws_getContext( aMovie->videoFrame->width, aMovie->videoFrame->height, @@ -142,7 +121,7 @@ static int DecodeVideoFrame(struct binkMovie* aMovie) aMovie->videoScaleFormat, SWS_FAST_BILINEAR, NULL, NULL, NULL); - if (aMovie->videoScaleContext==NULL) + if (aMovie->videoScaleContext == NULL) return 0; av_image_alloc(aMovie->videoScalePicture, aMovie->videoScaleLineSize, @@ -159,19 +138,13 @@ static int DecodeVideoFrame(struct binkMovie* aMovie) static int DecodeAudioFrame(struct binkMovie* aMovie) { - int decoded_frame_ready = 0; - av_frame_unref(aMovie->audioFrame); - //avcodec_get_frame_defaults(aMovie->audioFrame); - - int ret = avcodec_receive_frame(aMovie->audioCodecContext, aMovie->audioFrame); - if (ret < 0) + if (avcodec_receive_frame(aMovie->audioCodecContext, aMovie->audioFrame) != 0) return 0; - if(!SoundSys_IsOn()) + if (!SoundSys_IsOn()) return 0; - if(!aMovie->alInited) - { + if (!aMovie->alInited) { alGenSources(1, &aMovie->alSource); AL_CHECK(); @@ -188,46 +161,46 @@ static int DecodeAudioFrame(struct binkMovie* aMovie) AL_CHECK(); - aMovie->alNumFreeBuffers=FRAMEQUEUESIZE; - for(int i=0; ialNumFreeBuffers; i++) + aMovie->alNumFreeBuffers = FRAMEQUEUESIZE; + for (int i=0; i < aMovie->alNumFreeBuffers; i++) aMovie->alFreeBuffers[i] = aMovie->alBuffers[i]; - switch(aMovie->audioFrame->channel_layout) - { + switch (aMovie->audioFrame->channel_layout) { case AV_CH_LAYOUT_MONO: - aMovie->alFormat = (aMovie->audioFrame->format == AV_SAMPLE_FMT_U8) ? AL_FORMAT_MONO8 : AL_FORMAT_MONO16; + aMovie->alFormat = (aMovie->audioFrame->format == AV_SAMPLE_FMT_U8) ? + AL_FORMAT_MONO8 : AL_FORMAT_MONO16; aMovie->alNumChannels = 1; break; case AV_CH_LAYOUT_STEREO: - aMovie->alFormat = (aMovie->audioFrame->format == AV_SAMPLE_FMT_U8) ? AL_FORMAT_STEREO8 : AL_FORMAT_STEREO16; + aMovie->alFormat = (aMovie->audioFrame->format == AV_SAMPLE_FMT_U8) ? + AL_FORMAT_STEREO8 : AL_FORMAT_STEREO16; aMovie->alNumChannels = 2; break; } aMovie->alSampleRate = aMovie->audioFrame->sample_rate; - aMovie->audioTempBuffer = malloc(aMovie->alNumChannels * aMovie->audioFrame->nb_samples * 2 * 2); - aMovie->alInited=TRUE; + aMovie->audioTempBuffer = + malloc(aMovie->alNumChannels * aMovie->audioFrame->nb_samples * 2 * 2); + aMovie->alInited = TRUE; } - memset(aMovie->audioTempBuffer, 0, aMovie->alNumChannels * aMovie->audioFrame->nb_samples * 2 * 2); + memset(aMovie->audioTempBuffer, 0, + aMovie->alNumChannels * aMovie->audioFrame->nb_samples * 2 * 2); - if(aMovie->alNumChannels==0) + if (aMovie->alNumChannels == 0) return 0; // reclaim completed frames int processedBuffers = 0; alGetSourcei(aMovie->alSource, AL_BUFFERS_PROCESSED, &processedBuffers); - if(processedBuffers>0) - { + if (processedBuffers > 0) { alSourceStop(aMovie->alSource); - while(processedBuffers>0) - { + while (processedBuffers > 0) { ALuint buffer = 0; alSourceUnqueueBuffers(aMovie->alSource, 1, &buffer); AL_CHECK(); - if(buffer>0) - { + if (buffer > 0) { aMovie->alFreeBuffers[aMovie->alNumFreeBuffers] = buffer; aMovie->alNumFreeBuffers++; } @@ -237,27 +210,20 @@ static int DecodeAudioFrame(struct binkMovie* aMovie) } // queue this frame - if(aMovie->alNumFreeBuffers>0) - { + if (aMovie->alNumFreeBuffers > 0) { ALuint alBuffer = aMovie->alFreeBuffers[aMovie->alNumFreeBuffers-1]; int sampleCount = aMovie->audioFrame->nb_samples * aMovie->alNumChannels; + uint dataSize = sampleCount * 2; // 16bit is deafult + void* data = (void*)aMovie->audioFrame->extended_data[0]; - - // 16bit is deafult - uint dataSize = sampleCount*2; - void* data = (void*) aMovie->audioFrame->extended_data[0]; - - switch(aMovie->audioFrame->format) - { - case AV_SAMPLE_FMT_U8: - { + switch (aMovie->audioFrame->format) { + case AV_SAMPLE_FMT_U8: { dataSize = sampleCount; } break; default: - case AV_SAMPLE_FMT_S16: - { + case AV_SAMPLE_FMT_S16: { /* unsigned short* p = (unsigned short*) data; for(int i=0; iaudioTempBuffer; - short* tempBuf = (short*) aMovie->audioTempBuffer; - float* srcBuf = (float*) aMovie->audioFrame->extended_data[0]; - for(int i=0; iaudioTempBuffer; + short* tempBuf = (short*)aMovie->audioTempBuffer; + float* srcBuf = (float*)aMovie->audioFrame->extended_data[0]; + for (int i = 0; i < sampleCount; i++) { float val = srcBuf[i] * 32768; - if(val > 32767) val = 32767; - if(val < -32768) val = 32768; - tempBuf[i] = (short) val; - + if (val > 32767) + val = 32767; + if (val < -32768) + val = 32768; + tempBuf[i] = (short)val; } } break; - case AV_SAMPLE_FMT_S32: - { - data = (void*) aMovie->audioTempBuffer; - short* tempBuf = (short*) aMovie->audioTempBuffer; - unsigned int* srcBuf = (unsigned int*) aMovie->audioFrame->extended_data[0]; - for(int i=0; i>2) >> 16) & 0x0000FFFF); + case AV_SAMPLE_FMT_S32: { + data = (void*)aMovie->audioTempBuffer; + short* tempBuf = (short*)aMovie->audioTempBuffer; + unsigned int* srcBuf = (unsigned int*)aMovie->audioFrame->extended_data[0]; + for(int i = 0; i < sampleCount; i++) + tempBuf[i] = (short)(((*srcBuf - *srcBuf>>2) >> 16) & 0x0000FFFF); } break; - case AV_SAMPLE_FMT_FLTP: - { - data = (void*) aMovie->audioTempBuffer; - short* tempBuf = (short*) aMovie->audioTempBuffer; - - for(int i=0; iaudioFrame->nb_samples; i++) - { - for(int j=0; jalNumChannels; j++) - { - float* srcBuf = (float*) aMovie->audioFrame->extended_data[j]; + case AV_SAMPLE_FMT_FLTP: { + data = (void*)aMovie->audioTempBuffer; + short* tempBuf = (short*)aMovie->audioTempBuffer; + for (int i = 0; i < aMovie->audioFrame->nb_samples; i++) { + for (int j = 0; j < aMovie->alNumChannels; j++) { + float* srcBuf = (float*)aMovie->audioFrame->extended_data[j]; float val = srcBuf[i] * 32768; - if(val > 32767) val = 32767; - if(val < -32768) val = 32768; - tempBuf[(i*aMovie->alNumChannels)+j] = (short) val; + if (val > 32767) + val = 32767; + if (val < -32768) + val = 32768; + tempBuf[(i*aMovie->alNumChannels)+j] = (short)val; } } } break; } - + alSourceStop(aMovie->alSource); - //printf("fmt=%d, buffer size=%d, rdy=%d, len=%d, s1=%d, samples=%d\n", aMovie->audioFrame->format, dataSize, decoded_frame_ready, len, aPacket->size, sampleCount); - - alBufferData(alBuffer, aMovie->alFormat, data, dataSize-16, aMovie->alSampleRate); + alBufferData(alBuffer, aMovie->alFormat, data, dataSize - 16, aMovie->alSampleRate); AL_CHECK(); alSourceQueueBuffers(aMovie->alSource, 1, &alBuffer); @@ -334,6 +294,7 @@ static int ReadFrame(struct binkMovie* aMovie) { // Read from file if no packet is buffered. if (!aMovie->packet.buf && av_read_frame(aMovie->avContext, &aMovie->packet) < 0) { + // No more packets in file. if (aMovie->looping) { av_seek_frame(aMovie->avContext, -1, 0, 0); return ReadFrame(aMovie); @@ -363,33 +324,28 @@ static int ReadFrame(struct binkMovie* aMovie) } } - -static int BinkStartMovie(struct binkMovie* aMovie, const char* aFilename, BOOL aLoopFlag, BOOL aFmvFlag, BOOL aMusicFlag) +static int BinkStartMovie(struct binkMovie* aMovie, const char* aFilename, + BOOL aLoopFlag, BOOL aFmvFlag, BOOL aMusicFlag) { BinkInitMovieStruct(aMovie); aMovie->looping = aLoopFlag; - if(aFmvFlag) - { + if (aFmvFlag) { aMovie->videoScaleWidth = 128; aMovie->videoScaleHeight = 96; aMovie->videoScaleFormat = AV_PIX_FMT_RGB24; } - if(avformat_open_input(&aMovie->avContext, aFilename, NULL, NULL) < 0) - { + if (avformat_open_input(&aMovie->avContext, aFilename, NULL, NULL) != 0) return 0; - } - if(!avformat_find_stream_info(aMovie->avContext, NULL) < 0) - { + if (avformat_find_stream_info(aMovie->avContext, NULL) < 0) { BinkReleaseMovie(aMovie); return 0; } int numStreams = 0; - for(int i=0; iavContext->nb_streams; i++) - { + for (int i = 0; i < aMovie->avContext->nb_streams; i++) { const AVStream* stream = aMovie->avContext->streams[i]; const AVCodec* codec = avcodec_find_decoder(stream->codecpar->codec_id); if (!codec) @@ -398,49 +354,41 @@ static int BinkStartMovie(struct binkMovie* aMovie, const char* aFilename, BOOL if (!context) continue; if (avcodec_parameters_to_context(context, stream->codecpar) < 0 || - avcodec_open2(context, codec, NULL) < 0) { + avcodec_open2(context, codec, NULL) != 0) { avcodec_free_context(&context); continue; } - if (aMovie->videoStreamIndex < 0 && context->codec_type == AVMEDIA_TYPE_VIDEO) - { + if (aMovie->videoStreamIndex < 0 && context->codec_type == AVMEDIA_TYPE_VIDEO) { aMovie->videoCodecContext = context; aMovie->videoStreamIndex = i; aMovie->videoFrame = av_frame_alloc(); aMovie->videoFrameDuration = 1000.0f * (float)stream->time_base.num / (float)stream->time_base.den; numStreams++; - } - else if (aMovie->audioStreamIndex < 0 && context->codec_type == AVMEDIA_TYPE_AUDIO) - { + } else if (aMovie->audioStreamIndex < 0 && context->codec_type == AVMEDIA_TYPE_AUDIO) { aMovie->audioCodecContext = context; aMovie->audioStreamIndex = i; aMovie->audioFrame = av_frame_alloc(); numStreams++; - } - else - { + } else { avcodec_free_context(&context); } } - if(aMovie->videoStreamIndex < 0 && aMovie->audioStreamIndex < 0) - { + if (aMovie->videoStreamIndex < 0 && aMovie->audioStreamIndex < 0) { BinkReleaseMovie(aMovie); return 0; } - if(!aFmvFlag) - { - for(int i=0; i<(FRAMEQUEUESIZE-1) * numStreams; i++) + if (!aFmvFlag) { + for (int i = 0; i < (FRAMEQUEUESIZE-1) * numStreams; i++) ReadFrame(aMovie); } return 1; } - static int BinkUpdateMovie(struct binkMovie* aMovie) { if(!aMovie->avContext) @@ -467,21 +415,15 @@ static int BinkUpdateMovie(struct binkMovie* aMovie) break; } } + return !eof || playing; } - - -//----------------------------------------------------------------------------------------------- - - -void PlayBinkedFMV(char *filenamePtr, int volume) +void PlayBinkedFMV(char* filenamePtr, int volume) { struct binkMovie movie; - if (BinkStartMovie(&movie, filenamePtr, FALSE, FALSE, FALSE)) { alSourcef(movie.alSource, AL_GAIN, PlatVolumeToGain(volume)); - while (BinkUpdateMovie(&movie)) { BinkRenderMovie(&movie); FlipBuffers(); @@ -501,94 +443,78 @@ void StartMenuBackgroundBink() BinkStartMovie(&menuBackgroundMovie, "FMVs/Menubackground.bik", TRUE, FALSE, FALSE); } - int PlayMenuBackgroundBink() { ClearScreenToBlack(); - if(BinkUpdateMovie(&menuBackgroundMovie)) - { + if (BinkUpdateMovie(&menuBackgroundMovie)) { BinkRenderMovie(&menuBackgroundMovie); return 1; } return 0; } - void EndMenuBackgroundBink() { BinkReleaseMovie(&menuBackgroundMovie); } - //----------------------------------------------------------------------------------------------- struct binkMovie musicMovie; int StartMusicBink(char* filenamePtr, BOOL looping) { - if(!SoundSys_IsOn()) + if (!SoundSys_IsOn()) return 0; - - int ret = BinkStartMovie(&musicMovie, filenamePtr, looping, FALSE, TRUE); - return ret; + return BinkStartMovie(&musicMovie, filenamePtr, looping, FALSE, TRUE); } int PlayMusicBink(int volume) { - if(!SoundSys_IsOn()) + if (!SoundSys_IsOn()) return 1; - if(!musicMovie.avContext) + if (!musicMovie.avContext) return 1; - if(!(musicMovie.audioStreamIndex>=0 && musicMovie.alInited)) + if (musicMovie.audioStreamIndex < 0 || !musicMovie.alInited) return 1; alSourcef(musicMovie.alSource, AL_GAIN, PlatVolumeToGain(volume)); - for(int i=0; inb_streams * FRAMEQUEUESIZE; i++) - { + for (int i = 0; i < musicMovie.avContext->nb_streams * FRAMEQUEUESIZE; i++) { int processedBuffers = 0; alGetSourcei(musicMovie.alSource, AL_BUFFERS_PROCESSED, &processedBuffers); - if(processedBuffers + musicMovie.alNumFreeBuffers > 0) - { - if(!ReadFrame(&musicMovie)) - { + if (processedBuffers + musicMovie.alNumFreeBuffers > 0) + if (!ReadFrame(&musicMovie)) return 0; - } - } } return 1; } void EndMusicBink() { - if(!SoundSys_IsOn()) + if (SoundSys_IsOn()) return; - BinkReleaseMovie(&musicMovie); } - //----------------------------------------------------------------------------------------------- - FMVHandle CreateBinkFMV(char* filenamePtr) { struct binkMovie* movie = malloc(sizeof(struct binkMovie)); BinkInitMovieStruct(movie); - if(!BinkStartMovie(movie, filenamePtr, FALSE, TRUE, FALSE)) - { + if (!BinkStartMovie(movie, filenamePtr, FALSE, TRUE, FALSE)) { free(movie); return 0; } return (FMVHandle)movie; } - int UpdateBinkFMV(FMVHandle aFmvHandle, int volume) { - if(aFmvHandle==0) + if (aFmvHandle == 0) return 0; struct binkMovie* movie = (struct binkMovie*)aFmvHandle; @@ -600,10 +526,9 @@ int UpdateBinkFMV(FMVHandle aFmvHandle, int volume) return BinkUpdateMovie(movie); } - void CloseBinkFMV(FMVHandle aFmvHandle) { - if(aFmvHandle==0) + if (aFmvHandle == 0) return; struct binkMovie* movie = (struct binkMovie*)aFmvHandle; @@ -611,18 +536,13 @@ void CloseBinkFMV(FMVHandle aFmvHandle) free(movie); } - char* GetBinkFMVImage(FMVHandle aFmvHandle) { - if(aFmvHandle==0) + if (aFmvHandle == 0) return 0; struct binkMovie* movie = (struct binkMovie*)aFmvHandle; - if(!movie->videoScaleContext) return 0; - return movie->videoScalePicture[0]; } - - diff --git a/src/bink.h b/src/bink.h index a54cdee..060b506 100644 --- a/src/bink.h +++ b/src/bink.h @@ -1,15 +1,14 @@ -#ifndef _BINK_H_ -#define _BINK_H_ +#ifndef BINK_H +#define BINK_H -extern BOOL BinkSys_Init(); -extern void BinkSys_Release(); +#include "fixer.h" //--- intro/outro -extern void PlayBinkedFMV(char *filenamePtr, int volume); +extern void PlayBinkedFMV(char* filenamePtr, int volume); //--- menu background extern void StartMenuBackgroundBink(); -extern int PlayMenuBackgroundBink(); +extern int PlayMenuBackgroundBink(); extern void EndMenuBackgroundBink(); //---- music @@ -17,15 +16,12 @@ extern int StartMusicBink(char* filenamePtr, BOOL looping); extern int PlayMusicBink(int volume); extern void EndMusicBink(); - //---- ingame fmv -typedef unsigned int FMVHandle; +typedef unsigned int FMVHandle; -extern FMVHandle CreateBinkFMV(char* filenamePtr); -extern int UpdateBinkFMV(FMVHandle aFmvHandle, int volume); -extern void CloseBinkFMV(FMVHandle aFmvHandle); -extern char* GetBinkFMVImage(FMVHandle aFmvHandle); +extern FMVHandle CreateBinkFMV(char* filenamePtr); +extern int UpdateBinkFMV(FMVHandle aFmvHandle, int volume); +extern void CloseBinkFMV(FMVHandle aFmvHandle); +extern char* GetBinkFMVImage(FMVHandle aFmvHandle); - - -#endif //_BINK_H_ +#endif