From 140dc44882db4a32d40dc6993dca44142ec3909c Mon Sep 17 00:00:00 2001 From: Fredrik Mellbin Date: Sat, 25 Apr 2009 22:09:49 +0000 Subject: [PATCH] FFMS2: Another much needed set of fixes to the Haali part Originally committed to SVN as r2853. --- aegisub/FFmpegSource2/ffvideosource.cpp | 18 +++++++++++------- aegisub/FFmpegSource2/indexing.cpp | 18 +++++++++++------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/aegisub/FFmpegSource2/ffvideosource.cpp b/aegisub/FFmpegSource2/ffvideosource.cpp index 857535c39..ada12b2f3 100644 --- a/aegisub/FFmpegSource2/ffvideosource.cpp +++ b/aegisub/FFmpegSource2/ffvideosource.cpp @@ -648,7 +648,6 @@ HaaliVideoSource::HaaliVideoSource(const char *SourceFile, int Track, throw ErrorMsg; } - BSTR CodecID = NULL; CodecPrivate = NULL; int CodecPrivateSize = 0; int CurrentTrack = 0; @@ -663,14 +662,19 @@ HaaliVideoSource::HaaliVideoSource(const char *SourceFile, int Track, if (pBag) { CComVariant pV; - if (SUCCEEDED(pBag->Read(L"CodecID", &pV, NULL)) && SUCCEEDED(pV.ChangeType(VT_BSTR))) - CodecID = pV.bstrVal; - + pV.Clear(); if (SUCCEEDED(pBag->Read(L"CodecPrivate", &pV, NULL))) { CodecPrivateSize = vtSize(pV); CodecPrivate = new uint8_t[CodecPrivateSize]; vtCopy(pV, CodecPrivate); } + + pV.Clear(); + if (SUCCEEDED(pBag->Read(L"CodecID", &pV, NULL)) && SUCCEEDED(pV.ChangeType(VT_BSTR))) { + char ACodecID[2048]; + wcstombs(ACodecID, pV.bstrVal, 2000); + Codec = avcodec_find_decoder(MatroskaToFFCodecID(ACodecID, CodecPrivate)); + } } } pU = NULL; @@ -682,9 +686,6 @@ HaaliVideoSource::HaaliVideoSource(const char *SourceFile, int Track, CodecContext->extradata_size = CodecPrivateSize; CodecContext->thread_count = Threads; - char ACodecID[2048]; - wcstombs(ACodecID, CodecID, 2000); - Codec = avcodec_find_decoder(MatroskaToFFCodecID(ACodecID, CodecPrivate)); if (Codec == NULL) { Free(false); _snprintf(ErrorMsg, MsgSize, "Video codec not found"); @@ -738,8 +739,11 @@ HaaliVideoSource::HaaliVideoSource(const char *SourceFile, int Track, // Set AR variables CComVariant pV; + + pV.Clear(); if (SUCCEEDED(pBag->Read(L"Video.DisplayWidth", &pV, NULL)) && SUCCEEDED(pV.ChangeType(VT_UI4))) VP.SARNum = pV.uiVal; + pV.Clear(); if (SUCCEEDED(pBag->Read(L"Video.DisplayHeight", &pV, NULL)) && SUCCEEDED(pV.ChangeType(VT_UI4))) VP.SARDen = pV.uiVal; } diff --git a/aegisub/FFmpegSource2/indexing.cpp b/aegisub/FFmpegSource2/indexing.cpp index 3af86a0f1..97ce7c60a 100644 --- a/aegisub/FFmpegSource2/indexing.cpp +++ b/aegisub/FFmpegSource2/indexing.cpp @@ -272,7 +272,7 @@ static FrameIndex *MakeHaaliIndex(const char *SourceFile, int IndexMask, int Dum CComPtr pU; while (pEU->Next(1, &pU, NULL) == S_OK) { CComQIPtr pBag = pU; - BSTR CodecID = NULL; + AVCodec *CodecID = NULL; TrackTypes[CurrentTrack] = -200; uint8_t * CodecPrivate = NULL; int CodecPrivateSize = 0; @@ -280,17 +280,23 @@ static FrameIndex *MakeHaaliIndex(const char *SourceFile, int IndexMask, int Dum if (pBag) { CComVariant pV; - if (SUCCEEDED(pBag->Read(L"CodecID", &pV, NULL)) && SUCCEEDED(pV.ChangeType(VT_BSTR))) - CodecID = pV.bstrVal; - + pV.Clear(); if (SUCCEEDED(pBag->Read(L"Type", &pV, NULL)) && SUCCEEDED(pV.ChangeType(VT_UI4))) TrackTypes[CurrentTrack] = pV.uintVal; + pV.Clear(); if (SUCCEEDED(pBag->Read(L"CodecPrivate", &pV, NULL))) { CodecPrivateSize = vtSize(pV); CodecPrivate = new uint8_t[CodecPrivateSize]; vtCopy(pV, CodecPrivate); } + + pV.Clear(); + if (SUCCEEDED(pBag->Read(L"CodecID", &pV, NULL)) && SUCCEEDED(pV.ChangeType(VT_BSTR))) { + char ACodecID[2048]; + wcstombs(ACodecID, pV.bstrVal, 2000); + CodecID = avcodec_find_decoder(MatroskaToFFCodecID(ACodecID, CodecPrivate)); + } } TrackIndices->push_back(FrameInfoVector(1, 1000000000, TrackTypes[CurrentTrack] - 1)); @@ -301,9 +307,7 @@ static FrameIndex *MakeHaaliIndex(const char *SourceFile, int IndexMask, int Dum AudioCodecContext->extradata_size = CodecPrivateSize; AudioContexts[CurrentTrack].CTX = AudioCodecContext; - char ACodecID[2048]; - wcstombs(ACodecID, CodecID, 2000); - AVCodec *AudioCodec = avcodec_find_decoder(MatroskaToFFCodecID(ACodecID, NULL)); + AVCodec *AudioCodec = CodecID; if (AudioCodec == NULL) { av_free(AudioCodecContext); AudioContexts[CurrentTrack].CTX = NULL;