diff --git a/FFmpegSource2/ffavsfilters.cpp b/FFmpegSource2/ffavsfilters.cpp index 1f88ef27e..741f29331 100644 --- a/FFmpegSource2/ffavsfilters.cpp +++ b/FFmpegSource2/ffavsfilters.cpp @@ -23,7 +23,12 @@ #include "ffavisynth.h" #include "ffswscale.h" #include "ffpp.h" -#include "utils.h" + +int GetNumberOfLogicalCPUs() { + SYSTEM_INFO SI; + GetSystemInfo(&SI); + return SI.dwNumberOfProcessors; +} AVSValue __cdecl CreateFFIndex(AVSValue Args, void* UserData, IScriptEnvironment* Env) { FFMS_Init(); diff --git a/FFmpegSource2/ffms.h b/FFmpegSource2/ffms.h index f89548b35..c0603a61b 100644 --- a/FFmpegSource2/ffms.h +++ b/FFmpegSource2/ffms.h @@ -45,6 +45,53 @@ class FrameInfoVector; typedef int (FFMS_CC *IndexCallback)(int State, int64_t Current, int64_t Total, void *Private); +// PixelFormat declarations from avutil.h so external libraries don't necessarily have to include and ffmpeg headers +enum FFMS_PixelFormat { + FFMS_PIX_FMT_NONE= -1, + FFMS_PIX_FMT_YUV420P, ///< Planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) + FFMS_PIX_FMT_YUYV422, ///< Packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr + FFMS_PIX_FMT_RGB24, ///< Packed RGB 8:8:8, 24bpp, RGBRGB... + FFMS_PIX_FMT_BGR24, ///< Packed RGB 8:8:8, 24bpp, BGRBGR... + FFMS_PIX_FMT_YUV422P, ///< Planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) + FFMS_PIX_FMT_YUV444P, ///< Planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) + FFMS_PIX_FMT_RGB32, ///< Packed RGB 8:8:8, 32bpp, (msb)8A 8R 8G 8B(lsb), in cpu endianness + FFMS_PIX_FMT_YUV410P, ///< Planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) + FFMS_PIX_FMT_YUV411P, ///< Planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) + FFMS_PIX_FMT_RGB565, ///< Packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), in cpu endianness + FFMS_PIX_FMT_RGB555, ///< Packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), in cpu endianness most significant bit to 0 + FFMS_PIX_FMT_GRAY8, ///< Y , 8bpp + FFMS_PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black + FFMS_PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white + FFMS_PIX_FMT_PAL8, ///< 8 bit with PIX_FMT_RGB32 palette + FFMS_PIX_FMT_YUVJ420P, ///< Planar YUV 4:2:0, 12bpp, full scale (jpeg) + FFMS_PIX_FMT_YUVJ422P, ///< Planar YUV 4:2:2, 16bpp, full scale (jpeg) + FFMS_PIX_FMT_YUVJ444P, ///< Planar YUV 4:4:4, 24bpp, full scale (jpeg) + FFMS_PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing(xvmc_render.h) + FFMS_PIX_FMT_XVMC_MPEG2_IDCT, + FFMS_PIX_FMT_UYVY422, ///< Packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 + FFMS_PIX_FMT_UYYVYY411, ///< Packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 + FFMS_PIX_FMT_BGR32, ///< Packed RGB 8:8:8, 32bpp, (msb)8A 8B 8G 8R(lsb), in cpu endianness + FFMS_PIX_FMT_BGR565, ///< Packed RGB 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), in cpu endianness + FFMS_PIX_FMT_BGR555, ///< Packed RGB 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), in cpu endianness most significant bit to 1 + FFMS_PIX_FMT_BGR8, ///< Packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb) + FFMS_PIX_FMT_BGR4, ///< Packed RGB 1:2:1, 4bpp, (msb)1B 2G 1R(lsb) + FFMS_PIX_FMT_BGR4_BYTE, ///< Packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb) + FFMS_PIX_FMT_RGB8, ///< Packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb) + FFMS_PIX_FMT_RGB4, ///< Packed RGB 1:2:1, 4bpp, (msb)2R 3G 3B(lsb) + FFMS_PIX_FMT_RGB4_BYTE, ///< Packed RGB 1:2:1, 8bpp, (msb)2R 3G 3B(lsb) + FFMS_PIX_FMT_NV12, ///< Planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 for UV + FFMS_PIX_FMT_NV21, ///< as above, but U and V bytes are swapped + + FFMS_PIX_FMT_RGB32_1, ///< Packed RGB 8:8:8, 32bpp, (msb)8R 8G 8B 8A(lsb), in cpu endianness + FFMS_PIX_FMT_BGR32_1, ///< Packed RGB 8:8:8, 32bpp, (msb)8B 8G 8R 8A(lsb), in cpu endianness + + FFMS_PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian + FFMS_PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian + FFMS_PIX_FMT_YUV440P, ///< Planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) + FFMS_PIX_FMT_YUVJ440P, ///< Planar YUV 4:4:0 full scale (jpeg) + FFMS_PIX_FMT_YUVA420P, ///< Planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) +}; + // This is a subset of the original AVFrame only containing the most used parts. // Even if it might seem like a good idea to cast it back to a full AVFrame to // access a few more values you really shouldn't do that. Only the values present diff --git a/FFmpegSource2/ffvideosource.h b/FFmpegSource2/ffvideosource.h index 321477ef6..102e51817 100644 --- a/FFmpegSource2/ffvideosource.h +++ b/FFmpegSource2/ffvideosource.h @@ -28,10 +28,7 @@ extern "C" { #include } -#include #include - -#include "avisynth.h" #include "indexing.h" #include "utils.h" #include "ffms.h" diff --git a/FFmpegSource2/indexing.cpp b/FFmpegSource2/indexing.cpp index 76b6dde0b..9490b7163 100644 --- a/FFmpegSource2/indexing.cpp +++ b/FFmpegSource2/indexing.cpp @@ -308,8 +308,8 @@ FrameIndex *MakeIndex(const char *SourceFile, int AudioTrackMask, const char *Au TrackIndices->Decoder = 0; for (unsigned int i = 0; i < FormatContext->nb_streams; i++) - TrackIndices->push_back(FrameInfoVector(FormatContext->streams[i]->time_base.den, - FormatContext->streams[i]->time_base.num * 1000)); + TrackIndices->push_back(FrameInfoVector(FormatContext->streams[i]->time_base.num * 1000, + FormatContext->streams[i]->time_base.den)); AVPacket Packet; while (av_read_frame(FormatContext, &Packet) >= 0) { @@ -437,10 +437,10 @@ int FrameInfoVector::WriteTimecodes(const char *TimecodeFile, char *ErrorMsg, un return 1; } - Timecodes << "# timecode format v2\r\n"; + Timecodes << "# timecode format v2\n"; for (iterator Cur=begin(); Cur!=end(); Cur++) - Timecodes << (int64_t)((Cur->DTS * TB.Num) / (double)TB.Den) << "\r\n"; + Timecodes << (int64_t)((Cur->DTS * TB.Num) / (double)TB.Den) << "\n"; return 0; } diff --git a/FFmpegSource2/utils.cpp b/FFmpegSource2/utils.cpp index ac18326da..0b86f0901 100644 --- a/FFmpegSource2/utils.cpp +++ b/FFmpegSource2/utils.cpp @@ -109,12 +109,6 @@ int ResizerNameToSWSResizer(const char *AResizerName) { return 0; } -int GetNumberOfLogicalCPUs() { - SYSTEM_INFO SI; - GetSystemInfo(&SI); - return SI.dwNumberOfProcessors; -} - int ReadFrame(uint64_t FilePos, unsigned int &FrameSize, CompressedStream *CS, MatroskaReaderContext &Context, char *ErrorMsg, unsigned MsgSize) { if (CS) { char CSBuffer[4096]; @@ -196,6 +190,25 @@ bool AudioFMTIsFloat(SampleFormat FMT){ } } +// used for matroska<->ffmpeg codec ID mapping to avoid Win32 dependency +typedef struct BITMAPINFOHEADER { + uint32_t biSize; + int32_t biWidth; + int32_t biHeight; + uint16_t biPlanes; + uint16_t biBitCount; + uint32_t biCompression; + uint32_t biSizeImage; + int32_t biXPelsPerMeter; + int32_t biYPelsPerMeter; + uint32_t biClrUsed; + uint32_t biClrImportant; +} BITMAPINFOHEADER; + +#define MAKEFOURCC(ch0, ch1, ch2, ch3)\ + ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) |\ + ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 )) + CodecID MatroskaToFFCodecID(TrackInfo *TI) { char *Codec = TI->CodecID; /* Video Codecs */ diff --git a/FFmpegSource2/utils.h b/FFmpegSource2/utils.h index e9f654c30..ca3ac8b11 100644 --- a/FFmpegSource2/utils.h +++ b/FFmpegSource2/utils.h @@ -28,8 +28,6 @@ extern "C" { #include "MatroskaParser.h" } -#include -#include "avisynth.h" #include "stdiostream.h" struct MatroskaReaderContext { @@ -52,7 +50,6 @@ public: int GetCPUFlags(); int CSNameToPIXFMT(const char * ACSName, int ADefault); int ResizerNameToSWSResizer(const char *AResizerName); -int GetNumberOfLogicalCPUs(); int ReadFrame(uint64_t FilePos, unsigned int &FrameSize, CompressedStream *CS, MatroskaReaderContext &Context, char *ErrorMsg, unsigned MsgSize); bool AudioFMTIsFloat(SampleFormat FMT); CodecID MatroskaToFFCodecID(TrackInfo *TI); diff --git a/FFmpegSource2/wave64writer.cpp b/FFmpegSource2/wave64writer.cpp index b63eadba8..29ede63e4 100644 --- a/FFmpegSource2/wave64writer.cpp +++ b/FFmpegSource2/wave64writer.cpp @@ -20,6 +20,9 @@ #include "wave64writer.h" +#define WAVE_FORMAT_IEEE_FLOAT 0x0003 +#define WAVE_FORMAT_PCM 1 + static const uint8_t GuidRIFF[16]={ // {66666972-912E-11CF-A5D6-28DB04C10000} 0x72, 0x69, 0x66, 0x66, 0x2E, 0x91, 0xCF, 0x11, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 @@ -40,7 +43,7 @@ static const uint8_t Guiddata[16]={ 0x64, 0x61, 0x74, 0x61, 0xF3, 0xAC, 0xD3, 0x11, 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A }; -Wave64Writer::Wave64Writer(const char *Filename, WORD BitsPerSample, WORD Channels, DWORD SamplesPerSec, bool IsFloat) : std::ofstream(Filename, std::ios::out | std::ios::binary | std::ios::trunc) { +Wave64Writer::Wave64Writer(const char *Filename, uint16_t BitsPerSample, uint16_t Channels, uint32_t SamplesPerSec, bool IsFloat) : std::ofstream(Filename, std::ios::out | std::ios::binary | std::ios::trunc) { BytesWritten = 0; this->BitsPerSample = BitsPerSample; this->Channels = Channels; @@ -48,7 +51,7 @@ Wave64Writer::Wave64Writer(const char *Filename, WORD BitsPerSample, WORD Channe this->IsFloat = IsFloat; if (!is_open()) - throw "Blerror"; + throw "Failed to open destination file for writing"; WriteHeader(true, IsFloat); } @@ -59,7 +62,7 @@ Wave64Writer::~Wave64Writer() { } void Wave64Writer::WriteHeader(bool Initial, bool IsFloat) { - WAVEFORMATEX WFEX; + FFMS_WAVEFORMATEX WFEX; if (IsFloat) WFEX.wFormatTag = WAVE_FORMAT_IEEE_FLOAT; else diff --git a/FFmpegSource2/wave64writer.h b/FFmpegSource2/wave64writer.h index 504e2dc4c..d8d0ee6c5 100644 --- a/FFmpegSource2/wave64writer.h +++ b/FFmpegSource2/wave64writer.h @@ -21,21 +21,30 @@ #ifndef WAVE64WRITER_H #define WAVE64WRITER_H -#include -#include #include #include #include -class Wave64Writer : std::ofstream { +// this is to avoid depending on windows.h etc. +typedef struct FFMS_WAVEFORMATEX { + uint16_t wFormatTag; + uint16_t nChannels; + uint32_t nSamplesPerSec; + uint32_t nAvgBytesPerSec; + uint16_t nBlockAlign; + uint16_t wBitsPerSample; + uint16_t cbSize; +} FFMS_WAVEFORMATEX; + +class Wave64Writer : private std::ofstream { public: - Wave64Writer(const char *Filename, WORD BitsPerSample, WORD Channels, DWORD SamplesPerSec, bool IsFloat); + Wave64Writer(const char *Filename, uint16_t BitsPerSample, uint16_t Channels, uint32_t SamplesPerSec, bool IsFloat); ~Wave64Writer(); void WriteData(void *Data, std::streamsize Length); private: - WORD BitsPerSample; - WORD Channels; - DWORD SamplesPerSec; + int32_t BitsPerSample; + int32_t Channels; + uint32_t SamplesPerSec; uint64_t BytesWritten; uint32_t HeaderSize; bool IsFloat;