From 770e581ca77dd3bd5825e8a4b435fe28a6136c74 Mon Sep 17 00:00:00 2001 From: Fredrik Mellbin Date: Wed, 24 Sep 2008 14:11:45 +0000 Subject: [PATCH] FFmpegSource2: more portability Originally committed to SVN as r2389. --- FFmpegSource2/ffaudiosource.cpp | 2 ++ FFmpegSource2/ffavsfilters.cpp | 6 +++--- FFmpegSource2/ffms.cpp | 4 ++-- FFmpegSource2/ffms.h | 2 +- FFmpegSource2/indexing.cpp | 32 +++++++++++++++++++++----------- FFmpegSource2/indexing.h | 2 +- 6 files changed, 30 insertions(+), 18 deletions(-) diff --git a/FFmpegSource2/ffaudiosource.cpp b/FFmpegSource2/ffaudiosource.cpp index 9df353c23..6a86deb14 100644 --- a/FFmpegSource2/ffaudiosource.cpp +++ b/FFmpegSource2/ffaudiosource.cpp @@ -19,6 +19,8 @@ // THE SOFTWARE. #include "ffaudiosource.h" +#include + AudioBase::AudioBase() { diff --git a/FFmpegSource2/ffavsfilters.cpp b/FFmpegSource2/ffavsfilters.cpp index d059d0a3b..bbc0c25fb 100644 --- a/FFmpegSource2/ffavsfilters.cpp +++ b/FFmpegSource2/ffavsfilters.cpp @@ -62,7 +62,7 @@ AVSValue __cdecl CreateFFIndex(AVSValue Args, void* UserData, IScriptEnvironment FrameIndex *Index; if (OverWrite || !(Index = FFMS_ReadIndex(CacheFile, ErrorMsg, MsgSize))) { - if (!(Index = FFMS_MakeIndex(Source, IndexMask, DumpMask, AudioFile, NULL, NULL, ErrorMsg, MsgSize))) + if (!(Index = FFMS_MakeIndex(Source, IndexMask, DumpMask, AudioFile, true, NULL, NULL, ErrorMsg, MsgSize))) Env->ThrowError("FFIndex: %s", ErrorMsg); if (FFMS_WriteIndex(CacheFile, Index, ErrorMsg, MsgSize)) { FFMS_DestroyFrameIndex(Index); @@ -119,7 +119,7 @@ AVSValue __cdecl CreateFFVideoSource(AVSValue Args, void* UserData, IScriptEnvir FrameIndex *Index; if (Cache) { if (!(Index = FFMS_ReadIndex(CacheFile, ErrorMsg, MsgSize))) { - if (!(Index = FFMS_MakeIndex(Source, 0, 0, NULL, NULL, NULL, ErrorMsg, MsgSize))) + if (!(Index = FFMS_MakeIndex(Source, 0, 0, NULL, true, NULL, NULL, ErrorMsg, MsgSize))) Env->ThrowError("FFVideoSource: %s", ErrorMsg); if (Cache) @@ -176,7 +176,7 @@ AVSValue __cdecl CreateFFAudioSource(AVSValue Args, void* UserData, IScriptEnvir FrameIndex *Index; if (Cache) { if (!(Index = FFMS_ReadIndex(CacheFile, ErrorMsg, MsgSize))) { - if (!(Index = FFMS_MakeIndex(Source, -1, 0, CacheFile, NULL, NULL, ErrorMsg, MsgSize))) + if (!(Index = FFMS_MakeIndex(Source, -1, 0, CacheFile, true, NULL, NULL, ErrorMsg, MsgSize))) Env->ThrowError("FFAudioSource: %s", ErrorMsg); if (Cache) diff --git a/FFmpegSource2/ffms.cpp b/FFmpegSource2/ffms.cpp index 645402022..2305ff4cf 100644 --- a/FFmpegSource2/ffms.cpp +++ b/FFmpegSource2/ffms.cpp @@ -163,8 +163,8 @@ FFMS_API(int) FFMS_WriteTimecodes(FrameInfoVector *FIV, const char *TimecodeFile return FIV->WriteTimecodes(TimecodeFile, ErrorMsg, MsgSize); } -FFMS_API(FrameIndex *) FFMS_MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize) { - return MakeIndex(SourceFile, IndexMask, DumpMask, AudioFile, IP, Private, ErrorMsg, MsgSize); +FFMS_API(FrameIndex *) FFMS_MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, bool IgnoreDecodeErrors, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize) { + return MakeIndex(SourceFile, IndexMask, DumpMask, AudioFile, IgnoreDecodeErrors, IP, Private, ErrorMsg, MsgSize); } FFMS_API(FrameIndex *) FFMS_ReadIndex(const char *IndexFile, char *ErrorMsg, unsigned MsgSize) { diff --git a/FFmpegSource2/ffms.h b/FFmpegSource2/ffms.h index bf544f64d..da7d67048 100644 --- a/FFmpegSource2/ffms.h +++ b/FFmpegSource2/ffms.h @@ -182,7 +182,7 @@ FFMS_API(int) FFMS_FrameFromDTS(FrameInfoVector *FIV, int64_t DTS, char *ErrorMs FFMS_API(int) FFMS_ClosestFrameFromDTS(FrameInfoVector *FIV, int64_t DTS, char *ErrorMsg, unsigned MsgSize); FFMS_API(const TrackTimeBase *) FFMS_GetTimeBase(FrameInfoVector *FIV, char *ErrorMsg, unsigned MsgSize); FFMS_API(int) FFMS_WriteTimecodes(FrameInfoVector *FIV, const char *TimecodeFile, char *ErrorMsg, unsigned MsgSize); -FFMS_API(FrameIndex *) FFMS_MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize); +FFMS_API(FrameIndex *) FFMS_MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, bool IgnoreDecodeErrors, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize); FFMS_API(FrameIndex *) FFMS_ReadIndex(const char *IndexFile, char *ErrorMsg, unsigned MsgSize); FFMS_API(int) FFMS_WriteIndex(const char *IndexFile, FrameIndex *TrackIndices, char *ErrorMsg, unsigned MsgSize); diff --git a/FFmpegSource2/indexing.cpp b/FFmpegSource2/indexing.cpp index 57c07eb43..6c6331e19 100644 --- a/FFmpegSource2/indexing.cpp +++ b/FFmpegSource2/indexing.cpp @@ -129,7 +129,7 @@ int WriteIndex(const char *IndexFile, FrameIndex *TrackIndices, char *ErrorMsg, return 0; } -static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize) { +static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, bool IgnoreDecodeErrors, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize) { MatroskaFile *MF; char ErrorMessage[256]; MatroskaReaderContext MC; @@ -187,7 +187,6 @@ static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int } } else { IndexMask &= ~(1 << i); - DumpMask &= ~(1 << i); } } @@ -233,9 +232,15 @@ static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int int dbsize = AVCODEC_MAX_AUDIO_FRAME_SIZE*10; int Ret = avcodec_decode_audio2(AudioCodecContext, db, &dbsize, Data, Size); if (Ret < 0) { - _snprintf(ErrorMsg, MsgSize, "Audio decoding error"); - delete TrackIndices; - return NULL; + if (IgnoreDecodeErrors) { + (*TrackIndices)[Track].clear(); + IndexMask &= ~(1 << Track); + break; + } else { + _snprintf(ErrorMsg, MsgSize, "Audio decoding error"); + delete TrackIndices; + return NULL; + } } if (Ret > 0) { @@ -269,7 +274,7 @@ static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int return TrackIndices; } -FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize) { +FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, bool IgnoreDecodeErrors, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize) { AVFormatContext *FormatContext = NULL; IndexMask |= DumpMask; @@ -281,7 +286,7 @@ FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const // Do matroska indexing instead? if (!strcmp(FormatContext->iformat->name, "matroska")) { av_close_input_file(FormatContext); - return MakeMatroskaIndex(SourceFile, IndexMask, DumpMask, AudioFile, IP, Private, ErrorMsg, MsgSize); + return MakeMatroskaIndex(SourceFile, IndexMask, DumpMask, AudioFile, IgnoreDecodeErrors, IP, Private, ErrorMsg, MsgSize); } if (av_find_stream_info(FormatContext) < 0) { @@ -312,7 +317,6 @@ FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const } } else { IndexMask &= ~(1 << i); - DumpMask &= ~(1 << i); } } @@ -350,9 +354,15 @@ FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const int dbsize = AVCODEC_MAX_AUDIO_FRAME_SIZE*10; int Ret = avcodec_decode_audio2(AudioCodecContext, db, &dbsize, Data, Size); if (Ret < 0) { - _snprintf(ErrorMsg, MsgSize, "Audio decoding error"); - delete TrackIndices; - return NULL; + if (IgnoreDecodeErrors) { + (*TrackIndices)[Packet.stream_index].clear(); + IndexMask &= ~(1 << Packet.stream_index); + break; + } else { + _snprintf(ErrorMsg, MsgSize, "Audio decoding error"); + delete TrackIndices; + return NULL; + } } if (Ret > 0) { diff --git a/FFmpegSource2/indexing.h b/FFmpegSource2/indexing.h index 241d441aa..886599361 100644 --- a/FFmpegSource2/indexing.h +++ b/FFmpegSource2/indexing.h @@ -62,7 +62,7 @@ public: int Decoder; }; -FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize); +FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, bool IgnoreDecodeErrors, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize); FrameIndex *ReadIndex(const char *IndexFile, char *ErrorMsg, unsigned MsgSize); int WriteIndex(const char *IndexFile, FrameIndex *TrackIndices, char *ErrorMsg, unsigned MsgSize);