FFmpegSource2: crash less
Originally committed to SVN as r2404.
This commit is contained in:
parent
b0137363f6
commit
4683c5a9d0
3 changed files with 36 additions and 28 deletions
|
@ -118,9 +118,10 @@ AVSValue __cdecl CreateFFVideoSource(AVSValue Args, void* UserData, IScriptEnvir
|
||||||
if (!strcmp(CacheFile, ""))
|
if (!strcmp(CacheFile, ""))
|
||||||
CacheFile = DefaultCache.c_str();
|
CacheFile = DefaultCache.c_str();
|
||||||
|
|
||||||
FrameIndex *Index;
|
FrameIndex *Index = NULL;
|
||||||
if (Cache) {
|
if (Cache)
|
||||||
if (!(Index = FFMS_ReadIndex(CacheFile, ErrorMsg, MsgSize))) {
|
Index = FFMS_ReadIndex(CacheFile, ErrorMsg, MsgSize);
|
||||||
|
if (!Index) {
|
||||||
if (!(Index = FFMS_MakeIndex(Source, 0, 0, NULL, true, NULL, NULL, ErrorMsg, MsgSize)))
|
if (!(Index = FFMS_MakeIndex(Source, 0, 0, NULL, true, NULL, NULL, ErrorMsg, MsgSize)))
|
||||||
Env->ThrowError("FFVideoSource: %s", ErrorMsg);
|
Env->ThrowError("FFVideoSource: %s", ErrorMsg);
|
||||||
|
|
||||||
|
@ -130,7 +131,6 @@ AVSValue __cdecl CreateFFVideoSource(AVSValue Args, void* UserData, IScriptEnvir
|
||||||
Env->ThrowError("FFVideoSource: %s", ErrorMsg);
|
Env->ThrowError("FFVideoSource: %s", ErrorMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (Track == -1)
|
if (Track == -1)
|
||||||
Track = FFMS_GetFirstTrackOfType(Index, FFMS_TYPE_VIDEO, ErrorMsg, MsgSize);
|
Track = FFMS_GetFirstTrackOfType(Index, FFMS_TYPE_VIDEO, ErrorMsg, MsgSize);
|
||||||
|
@ -179,9 +179,10 @@ AVSValue __cdecl CreateFFAudioSource(AVSValue Args, void* UserData, IScriptEnvir
|
||||||
if (!strcmp(CacheFile, ""))
|
if (!strcmp(CacheFile, ""))
|
||||||
CacheFile = DefaultCache.c_str();
|
CacheFile = DefaultCache.c_str();
|
||||||
|
|
||||||
FrameIndex *Index;
|
FrameIndex *Index = NULL;
|
||||||
if (Cache) {
|
if (Cache)
|
||||||
if (!(Index = FFMS_ReadIndex(CacheFile, ErrorMsg, MsgSize))) {
|
Index = FFMS_ReadIndex(CacheFile, ErrorMsg, MsgSize);
|
||||||
|
if (!Index) {
|
||||||
if (!(Index = FFMS_MakeIndex(Source, -1, 0, CacheFile, true, NULL, NULL, ErrorMsg, MsgSize)))
|
if (!(Index = FFMS_MakeIndex(Source, -1, 0, CacheFile, true, NULL, NULL, ErrorMsg, MsgSize)))
|
||||||
Env->ThrowError("FFAudioSource: %s", ErrorMsg);
|
Env->ThrowError("FFAudioSource: %s", ErrorMsg);
|
||||||
|
|
||||||
|
@ -191,7 +192,6 @@ AVSValue __cdecl CreateFFAudioSource(AVSValue Args, void* UserData, IScriptEnvir
|
||||||
Env->ThrowError("FFAudioSource: %s", ErrorMsg);
|
Env->ThrowError("FFAudioSource: %s", ErrorMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (Track == -1)
|
if (Track == -1)
|
||||||
Track = FFMS_GetFirstTrackOfType(Index, FFMS_TYPE_AUDIO, ErrorMsg, MsgSize);
|
Track = FFMS_GetFirstTrackOfType(Index, FFMS_TYPE_AUDIO, ErrorMsg, MsgSize);
|
||||||
|
|
|
@ -110,7 +110,7 @@ VideoBase::~VideoBase() {
|
||||||
}
|
}
|
||||||
|
|
||||||
AVFrameLite *VideoBase::GetFrameByTime(double Time, char *ErrorMsg, unsigned MsgSize) {
|
AVFrameLite *VideoBase::GetFrameByTime(double Time, char *ErrorMsg, unsigned MsgSize) {
|
||||||
int Frame = Frames.ClosestFrameFromDTS((Time * Frames.TB.Num) / Frames.TB.Den);
|
int Frame = Frames.ClosestFrameFromDTS((Time * Frames.TB.Num) / Frames.TB.Den + 0.5);
|
||||||
return GetFrame(Frame, ErrorMsg, MsgSize);
|
return GetFrame(Frame, ErrorMsg, MsgSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ public:
|
||||||
|
|
||||||
FFAudioContext() {
|
FFAudioContext() {
|
||||||
W64W = NULL;
|
W64W = NULL;
|
||||||
CTX = 0;
|
CTX = NULL;
|
||||||
CurrentSample = 0;
|
CurrentSample = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,6 +206,8 @@ static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int
|
||||||
if (mkv_GetTrackInfo(MF, i)->CompEnabled) {
|
if (mkv_GetTrackInfo(MF, i)->CompEnabled) {
|
||||||
AudioContexts[i].CS = cs_Create(MF, i, ErrorMessage, sizeof(ErrorMessage));
|
AudioContexts[i].CS = cs_Create(MF, i, ErrorMessage, sizeof(ErrorMessage));
|
||||||
if (AudioContexts[i].CS == NULL) {
|
if (AudioContexts[i].CS == NULL) {
|
||||||
|
av_free(AudioCodecContext);
|
||||||
|
AudioContexts[i].CTX = NULL;
|
||||||
_snprintf(ErrorMsg, MsgSize, "Can't create decompressor: %s", ErrorMessage);
|
_snprintf(ErrorMsg, MsgSize, "Can't create decompressor: %s", ErrorMessage);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -213,11 +215,15 @@ static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int
|
||||||
|
|
||||||
AVCodec *AudioCodec = avcodec_find_decoder(MatroskaToFFCodecID(mkv_GetTrackInfo(MF, i)));
|
AVCodec *AudioCodec = avcodec_find_decoder(MatroskaToFFCodecID(mkv_GetTrackInfo(MF, i)));
|
||||||
if (AudioCodec == NULL) {
|
if (AudioCodec == NULL) {
|
||||||
|
av_free(AudioCodecContext);
|
||||||
|
AudioContexts[i].CTX = NULL;
|
||||||
_snprintf(ErrorMsg, MsgSize, "Audio codec not found");
|
_snprintf(ErrorMsg, MsgSize, "Audio codec not found");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avcodec_open(AudioCodecContext, AudioCodec) < 0) {
|
if (avcodec_open(AudioCodecContext, AudioCodec) < 0) {
|
||||||
|
av_free(AudioCodecContext);
|
||||||
|
AudioContexts[i].CTX = NULL;
|
||||||
_snprintf(ErrorMsg, MsgSize, "Could not open audio codec");
|
_snprintf(ErrorMsg, MsgSize, "Could not open audio codec");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -350,6 +356,8 @@ FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const
|
||||||
_snprintf(ErrorMsg, MsgSize, "Could not open audio codec");
|
_snprintf(ErrorMsg, MsgSize, "Could not open audio codec");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AudioContexts[i].CTX = AudioCodecContext;
|
||||||
} else {
|
} else {
|
||||||
IndexMask &= ~(1 << i);
|
IndexMask &= ~(1 << i);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue