FFMS2: Less enum forward declaration?
Originally committed to SVN as r2849.
This commit is contained in:
parent
f8652576c8
commit
6f6d1bdf3a
8 changed files with 66 additions and 43 deletions
|
@ -209,6 +209,6 @@ FFMS_API(int) FFMS_WriteIndex(const char *IndexFile, FrameIndex *TrackIndices, c
|
||||||
return WriteIndex(IndexFile, TrackIndices, ErrorMsg, MsgSize);
|
return WriteIndex(IndexFile, TrackIndices, ErrorMsg, MsgSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
FFMS_API(enum PixelFormat) FFMS_GetPixFmt(const char *Name) {
|
FFMS_API(int) FFMS_GetPixFmt(const char *Name) {
|
||||||
return avcodec_get_pix_fmt(Name);
|
return avcodec_get_pix_fmt(Name);
|
||||||
}
|
}
|
|
@ -48,8 +48,6 @@ class FrameInfoVector;
|
||||||
|
|
||||||
typedef int (FFMS_CC *IndexCallback)(int State, int64_t Current, int64_t Total, void *Private);
|
typedef int (FFMS_CC *IndexCallback)(int State, int64_t Current, int64_t Total, void *Private);
|
||||||
|
|
||||||
enum PixelFormat;
|
|
||||||
|
|
||||||
enum FFMS_SeekMode {
|
enum FFMS_SeekMode {
|
||||||
FFMS_SEEK_LINEAR_NO_RW = -1,
|
FFMS_SEEK_LINEAR_NO_RW = -1,
|
||||||
FFMS_SEEK_LINEAR = 0,
|
FFMS_SEEK_LINEAR = 0,
|
||||||
|
@ -148,5 +146,5 @@ FFMS_API(int) FFMS_WriteTimecodes(FrameInfoVector *FIV, const char *TimecodeFile
|
||||||
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_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(FrameIndex *) FFMS_ReadIndex(const char *IndexFile, char *ErrorMsg, unsigned MsgSize);
|
||||||
FFMS_API(int) FFMS_WriteIndex(const char *IndexFile, FrameIndex *TrackIndices, char *ErrorMsg, unsigned MsgSize);
|
FFMS_API(int) FFMS_WriteIndex(const char *IndexFile, FrameIndex *TrackIndices, char *ErrorMsg, unsigned MsgSize);
|
||||||
FFMS_API(PixelFormat) FFMS_GetPixFmt(const char *Name);
|
FFMS_API(int) FFMS_GetPixFmt(const char *Name);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -60,9 +60,9 @@ int main(int argc, char *argv[]) {
|
||||||
FFMS_NoLog();
|
FFMS_NoLog();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum PixelFormat FMT_YV12A = FFMS_GetPixFmt("PIX_FMT_YUV420P)");
|
int FMT_YV12A = FFMS_GetPixFmt("PIX_FMT_YUV420P)");
|
||||||
enum PixelFormat FMT_YV12B = FFMS_GetPixFmt("PIX_FMT_YUVJ420P");
|
int FMT_YV12B = FFMS_GetPixFmt("PIX_FMT_YUVJ420P");
|
||||||
enum PixelFormat FMT_YUY2 = FFMS_GetPixFmt("PIX_FMT_YUV422P");
|
int FMT_YUY2 = FFMS_GetPixFmt("PIX_FMT_YUV422P");
|
||||||
|
|
||||||
av_md5_init(ctx);
|
av_md5_init(ctx);
|
||||||
FrameIndex *FI = FFMS_MakeIndex(argv[1], -1, 0, NULL, false, UpdateProgress, argv[1], ErrorMsg, sizeof(ErrorMsg));
|
FrameIndex *FI = FFMS_MakeIndex(argv[1], -1, 0, NULL, false, UpdateProgress, argv[1], ErrorMsg, sizeof(ErrorMsg));
|
||||||
|
|
|
@ -591,32 +591,11 @@ AVFrameLite *MatroskaVideoSource::GetFrame(int n, char *ErrorMsg, unsigned MsgSi
|
||||||
|
|
||||||
#ifdef HAALISOURCE
|
#ifdef HAALISOURCE
|
||||||
|
|
||||||
static unsigned vtSize(VARIANT &vt) {
|
|
||||||
if (V_VT(&vt) != (VT_ARRAY | VT_UI1))
|
|
||||||
return 0;
|
|
||||||
long lb,ub;
|
|
||||||
if (FAILED(SafeArrayGetLBound(V_ARRAY(&vt),1,&lb)) ||
|
|
||||||
FAILED(SafeArrayGetUBound(V_ARRAY(&vt),1,&ub)))
|
|
||||||
return 0;
|
|
||||||
return ub - lb + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vtCopy(VARIANT& vt,void *dest) {
|
|
||||||
unsigned sz = vtSize(vt);
|
|
||||||
if (sz > 0) {
|
|
||||||
void *vp;
|
|
||||||
if (SUCCEEDED(SafeArrayAccessData(V_ARRAY(&vt),&vp))) {
|
|
||||||
memcpy(dest,vp,sz);
|
|
||||||
SafeArrayUnaccessData(V_ARRAY(&vt));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void HaaliVideoSource::Free(bool CloseCodec) {
|
void HaaliVideoSource::Free(bool CloseCodec) {
|
||||||
if (CloseCodec)
|
if (CloseCodec)
|
||||||
avcodec_close(CodecContext);
|
avcodec_close(CodecContext);
|
||||||
av_free(CodecContext);
|
av_free(CodecContext);
|
||||||
free(CodecPrivate);
|
delete[] CodecPrivate;
|
||||||
}
|
}
|
||||||
|
|
||||||
HaaliVideoSource::HaaliVideoSource(const char *SourceFile, int Track,
|
HaaliVideoSource::HaaliVideoSource(const char *SourceFile, int Track,
|
||||||
|
@ -684,12 +663,12 @@ HaaliVideoSource::HaaliVideoSource(const char *SourceFile, int Track,
|
||||||
if (pBag) {
|
if (pBag) {
|
||||||
CComVariant pV;
|
CComVariant pV;
|
||||||
|
|
||||||
if (pBag->Read(L"CodecID", &pV, NULL) == S_OK)
|
if (SUCCEEDED(pBag->Read(L"CodecID", &pV, NULL)) && SUCCEEDED(pV.ChangeType(VT_BSTR)))
|
||||||
CodecID = pV.bstrVal;
|
CodecID = pV.bstrVal;
|
||||||
|
|
||||||
if (pBag->Read(L"CodecPrivate", &pV, NULL) == S_OK) {
|
if (SUCCEEDED(pBag->Read(L"CodecPrivate", &pV, NULL))) {
|
||||||
CodecPrivateSize = vtSize(pV);
|
CodecPrivateSize = vtSize(pV);
|
||||||
CodecPrivate = static_cast<uint8_t*>(malloc(CodecPrivateSize));
|
CodecPrivate = new uint8_t[CodecPrivateSize];
|
||||||
vtCopy(pV, CodecPrivate);
|
vtCopy(pV, CodecPrivate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -759,9 +738,9 @@ HaaliVideoSource::HaaliVideoSource(const char *SourceFile, int Track,
|
||||||
|
|
||||||
// Set AR variables
|
// Set AR variables
|
||||||
CComVariant pV;
|
CComVariant pV;
|
||||||
if (pBag->Read(L"Video.DisplayWidth", &pV, NULL) == S_OK)
|
if (SUCCEEDED(pBag->Read(L"Video.DisplayWidth", &pV, NULL)) && SUCCEEDED(pV.ChangeType(VT_UI4)))
|
||||||
VP.SARNum = pV.uiVal;
|
VP.SARNum = pV.uiVal;
|
||||||
if (pBag->Read(L"Video.DisplayHeight", &pV, NULL) == S_OK)
|
if (SUCCEEDED(pBag->Read(L"Video.DisplayHeight", &pV, NULL)) && SUCCEEDED(pV.ChangeType(VT_UI4)))
|
||||||
VP.SARDen = pV.uiVal;
|
VP.SARDen = pV.uiVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,15 +57,18 @@ public:
|
||||||
AVCodecContext *CTX;
|
AVCodecContext *CTX;
|
||||||
CompressedStream *CS;
|
CompressedStream *CS;
|
||||||
int64_t CurrentSample;
|
int64_t CurrentSample;
|
||||||
|
uint8_t *CodecPrivate;
|
||||||
|
|
||||||
MatroskaAudioContext() {
|
MatroskaAudioContext() {
|
||||||
W64W = NULL;
|
W64W = NULL;
|
||||||
CTX = NULL;
|
CTX = NULL;
|
||||||
CS = NULL;
|
CS = NULL;
|
||||||
CurrentSample = 0;
|
CurrentSample = 0;
|
||||||
|
CodecPrivate = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
~MatroskaAudioContext() {
|
~MatroskaAudioContext() {
|
||||||
|
delete[] CodecPrivate;
|
||||||
delete W64W;
|
delete W64W;
|
||||||
if (CTX) {
|
if (CTX) {
|
||||||
avcodec_close(CTX);
|
avcodec_close(CTX);
|
||||||
|
@ -216,13 +219,13 @@ static FrameIndex *MakeHaaliIndex(const char *SourceFile, int IndexMask, int Dum
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
CComPtr<IMemAlloc> pMA;
|
CComPtr<IMemAlloc> pMA;
|
||||||
if (FAILED(pMA.CoCreateInstance(CLSID_MemAlloc))) {
|
if (FAILED(pMA.CoCreateInstance(CLSID_MemAlloc))) {
|
||||||
_snprintf(ErrorMsg, MsgSize, "Can't create memory allocator");
|
_snprintf(ErrorMsg, MsgSize, "Can't create memory allocator");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
CComPtr<IMMStream> pMS;
|
CComPtr<IMMStream> pMS;
|
||||||
if (FAILED(pMS.CoCreateInstance(CLSID_DiskFile))) {
|
if (FAILED(pMS.CoCreateInstance(CLSID_DiskFile))) {
|
||||||
_snprintf(ErrorMsg, MsgSize, "Can't create disk file reader");
|
_snprintf(ErrorMsg, MsgSize, "Can't create disk file reader");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -277,15 +280,16 @@ static FrameIndex *MakeHaaliIndex(const char *SourceFile, int IndexMask, int Dum
|
||||||
if (pBag) {
|
if (pBag) {
|
||||||
CComVariant pV;
|
CComVariant pV;
|
||||||
|
|
||||||
if (pBag->Read(L"CodecID", &pV, NULL) == S_OK)
|
if (SUCCEEDED(pBag->Read(L"CodecID", &pV, NULL)) && SUCCEEDED(pV.ChangeType(VT_BSTR)))
|
||||||
CodecID = pV.bstrVal;
|
CodecID = pV.bstrVal;
|
||||||
|
|
||||||
if (pBag->Read(L"Type", &pV, NULL) == S_OK)
|
if (SUCCEEDED(pBag->Read(L"Type", &pV, NULL)) && SUCCEEDED(pV.ChangeType(VT_UI4)))
|
||||||
TrackTypes[CurrentTrack] = pV.uintVal;
|
TrackTypes[CurrentTrack] = pV.uintVal;
|
||||||
|
|
||||||
if (pBag->Read(L"CodecPrivate", &pV, NULL) == S_OK) {
|
if (SUCCEEDED(pBag->Read(L"CodecPrivate", &pV, NULL))) {
|
||||||
CodecPrivate = (uint8_t *)pV.parray->pvData;
|
CodecPrivateSize = vtSize(pV);
|
||||||
CodecPrivateSize = pV.parray->cbElements;
|
CodecPrivate = new uint8_t[CodecPrivateSize];
|
||||||
|
vtCopy(pV, CodecPrivate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -339,7 +343,7 @@ static FrameIndex *MakeHaaliIndex(const char *SourceFile, int IndexMask, int Dum
|
||||||
if (pMMC->ReadFrame(NULL, &pMMF) != S_OK)
|
if (pMMC->ReadFrame(NULL, &pMMF) != S_OK)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
REFERENCE_TIME Ts, Te;
|
REFERENCE_TIME Ts, Te;
|
||||||
HRESULT hr = pMMF->GetTime(&Ts, &Te);
|
HRESULT hr = pMMF->GetTime(&Ts, &Te);
|
||||||
|
|
||||||
unsigned int CurrentTrack = pMMF->GetTrack();
|
unsigned int CurrentTrack = pMMF->GetTrack();
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "ffms.h"
|
#include "ffms.h"
|
||||||
|
|
||||||
#define INDEXVERSION 17
|
#define INDEXVERSION 18
|
||||||
#define INDEXID 0x53920873
|
#define INDEXID 0x53920873
|
||||||
|
|
||||||
struct IndexHeader {
|
struct IndexHeader {
|
||||||
|
|
|
@ -137,6 +137,31 @@ void init_null_packet(AVPacket *pkt) {
|
||||||
pkt->size = 0;
|
pkt->size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAALISOURCE
|
||||||
|
|
||||||
|
unsigned vtSize(VARIANT &vt) {
|
||||||
|
if (V_VT(&vt) != (VT_ARRAY | VT_UI1))
|
||||||
|
return 0;
|
||||||
|
long lb,ub;
|
||||||
|
if (FAILED(SafeArrayGetLBound(V_ARRAY(&vt),1,&lb)) ||
|
||||||
|
FAILED(SafeArrayGetUBound(V_ARRAY(&vt),1,&ub)))
|
||||||
|
return 0;
|
||||||
|
return ub - lb + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vtCopy(VARIANT& vt,void *dest) {
|
||||||
|
unsigned sz = vtSize(vt);
|
||||||
|
if (sz > 0) {
|
||||||
|
void *vp;
|
||||||
|
if (SUCCEEDED(SafeArrayAccessData(V_ARRAY(&vt),&vp))) {
|
||||||
|
memcpy(dest,vp,sz);
|
||||||
|
SafeArrayUnaccessData(V_ARRAY(&vt));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
// used for matroska<->ffmpeg codec ID mapping to avoid Win32 dependency
|
// used for matroska<->ffmpeg codec ID mapping to avoid Win32 dependency
|
||||||
typedef struct BITMAPINFOHEADER {
|
typedef struct BITMAPINFOHEADER {
|
||||||
uint32_t biSize;
|
uint32_t biSize;
|
||||||
|
@ -152,6 +177,8 @@ typedef struct BITMAPINFOHEADER {
|
||||||
uint32_t biClrImportant;
|
uint32_t biClrImportant;
|
||||||
} BITMAPINFOHEADER;
|
} BITMAPINFOHEADER;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MAKEFOURCC(ch0, ch1, ch2, ch3)\
|
#define MAKEFOURCC(ch0, ch1, ch2, ch3)\
|
||||||
((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) |\
|
((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) |\
|
||||||
((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 ))
|
((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 ))
|
||||||
|
|
|
@ -31,6 +31,17 @@ extern "C" {
|
||||||
#include "stdiostream.h"
|
#include "stdiostream.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAALISOURCE
|
||||||
|
# define _WIN32_DCOM
|
||||||
|
# include <windows.h>
|
||||||
|
# include <tchar.h>
|
||||||
|
# include <atlbase.h>
|
||||||
|
# include <dshow.h>
|
||||||
|
# include "CoParser.h"
|
||||||
|
# include <initguid.h>
|
||||||
|
# include "guids.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
struct MatroskaReaderContext {
|
struct MatroskaReaderContext {
|
||||||
public:
|
public:
|
||||||
StdIoStream ST;
|
StdIoStream ST;
|
||||||
|
@ -52,6 +63,10 @@ int GetCPUFlags();
|
||||||
int ReadFrame(uint64_t FilePos, unsigned int &FrameSize, CompressedStream *CS, MatroskaReaderContext &Context, char *ErrorMsg, unsigned MsgSize);
|
int ReadFrame(uint64_t FilePos, unsigned int &FrameSize, CompressedStream *CS, MatroskaReaderContext &Context, char *ErrorMsg, unsigned MsgSize);
|
||||||
bool AudioFMTIsFloat(SampleFormat FMT);
|
bool AudioFMTIsFloat(SampleFormat FMT);
|
||||||
void init_null_packet(AVPacket *pkt);
|
void init_null_packet(AVPacket *pkt);
|
||||||
|
#ifdef HAALISOURCE
|
||||||
|
unsigned vtSize(VARIANT &vt);
|
||||||
|
void vtCopy(VARIANT& vt,void *dest);
|
||||||
|
#endif
|
||||||
CodecID MatroskaToFFCodecID(char *Codec, void *CodecPrivate);
|
CodecID MatroskaToFFCodecID(char *Codec, void *CodecPrivate);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue