mirror of https://github.com/odrling/Aegisub
FFmpegSource2: apply dewindowsification patches
Originally committed to SVN as r2331.
This commit is contained in:
parent
e702d9edca
commit
54dd632542
|
@ -23,7 +23,12 @@
|
||||||
#include "ffavisynth.h"
|
#include "ffavisynth.h"
|
||||||
#include "ffswscale.h"
|
#include "ffswscale.h"
|
||||||
#include "ffpp.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) {
|
AVSValue __cdecl CreateFFIndex(AVSValue Args, void* UserData, IScriptEnvironment* Env) {
|
||||||
FFMS_Init();
|
FFMS_Init();
|
||||||
|
|
|
@ -45,6 +45,53 @@ 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);
|
||||||
|
|
||||||
|
// 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.
|
// 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
|
// 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
|
// access a few more values you really shouldn't do that. Only the values present
|
||||||
|
|
|
@ -28,10 +28,7 @@ extern "C" {
|
||||||
#include <libpostproc/postprocess.h>
|
#include <libpostproc/postprocess.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "avisynth.h"
|
|
||||||
#include "indexing.h"
|
#include "indexing.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "ffms.h"
|
#include "ffms.h"
|
||||||
|
|
|
@ -308,8 +308,8 @@ FrameIndex *MakeIndex(const char *SourceFile, int AudioTrackMask, const char *Au
|
||||||
TrackIndices->Decoder = 0;
|
TrackIndices->Decoder = 0;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < FormatContext->nb_streams; i++)
|
for (unsigned int i = 0; i < FormatContext->nb_streams; i++)
|
||||||
TrackIndices->push_back(FrameInfoVector(FormatContext->streams[i]->time_base.den,
|
TrackIndices->push_back(FrameInfoVector(FormatContext->streams[i]->time_base.num * 1000,
|
||||||
FormatContext->streams[i]->time_base.num * 1000));
|
FormatContext->streams[i]->time_base.den));
|
||||||
|
|
||||||
AVPacket Packet;
|
AVPacket Packet;
|
||||||
while (av_read_frame(FormatContext, &Packet) >= 0) {
|
while (av_read_frame(FormatContext, &Packet) >= 0) {
|
||||||
|
@ -437,10 +437,10 @@ int FrameInfoVector::WriteTimecodes(const char *TimecodeFile, char *ErrorMsg, un
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Timecodes << "# timecode format v2\r\n";
|
Timecodes << "# timecode format v2\n";
|
||||||
|
|
||||||
for (iterator Cur=begin(); Cur!=end(); Cur++)
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,12 +109,6 @@ int ResizerNameToSWSResizer(const char *AResizerName) {
|
||||||
return 0;
|
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) {
|
int ReadFrame(uint64_t FilePos, unsigned int &FrameSize, CompressedStream *CS, MatroskaReaderContext &Context, char *ErrorMsg, unsigned MsgSize) {
|
||||||
if (CS) {
|
if (CS) {
|
||||||
char CSBuffer[4096];
|
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) {
|
CodecID MatroskaToFFCodecID(TrackInfo *TI) {
|
||||||
char *Codec = TI->CodecID;
|
char *Codec = TI->CodecID;
|
||||||
/* Video Codecs */
|
/* Video Codecs */
|
||||||
|
|
|
@ -28,8 +28,6 @@ extern "C" {
|
||||||
#include "MatroskaParser.h"
|
#include "MatroskaParser.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include "avisynth.h"
|
|
||||||
#include "stdiostream.h"
|
#include "stdiostream.h"
|
||||||
|
|
||||||
struct MatroskaReaderContext {
|
struct MatroskaReaderContext {
|
||||||
|
@ -52,7 +50,6 @@ public:
|
||||||
int GetCPUFlags();
|
int GetCPUFlags();
|
||||||
int CSNameToPIXFMT(const char * ACSName, int ADefault);
|
int CSNameToPIXFMT(const char * ACSName, int ADefault);
|
||||||
int ResizerNameToSWSResizer(const char *AResizerName);
|
int ResizerNameToSWSResizer(const char *AResizerName);
|
||||||
int GetNumberOfLogicalCPUs();
|
|
||||||
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);
|
||||||
CodecID MatroskaToFFCodecID(TrackInfo *TI);
|
CodecID MatroskaToFFCodecID(TrackInfo *TI);
|
||||||
|
|
|
@ -20,6 +20,9 @@
|
||||||
|
|
||||||
#include "wave64writer.h"
|
#include "wave64writer.h"
|
||||||
|
|
||||||
|
#define WAVE_FORMAT_IEEE_FLOAT 0x0003
|
||||||
|
#define WAVE_FORMAT_PCM 1
|
||||||
|
|
||||||
static const uint8_t GuidRIFF[16]={
|
static const uint8_t GuidRIFF[16]={
|
||||||
// {66666972-912E-11CF-A5D6-28DB04C10000}
|
// {66666972-912E-11CF-A5D6-28DB04C10000}
|
||||||
0x72, 0x69, 0x66, 0x66, 0x2E, 0x91, 0xCF, 0x11, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
|
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
|
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;
|
BytesWritten = 0;
|
||||||
this->BitsPerSample = BitsPerSample;
|
this->BitsPerSample = BitsPerSample;
|
||||||
this->Channels = Channels;
|
this->Channels = Channels;
|
||||||
|
@ -48,7 +51,7 @@ Wave64Writer::Wave64Writer(const char *Filename, WORD BitsPerSample, WORD Channe
|
||||||
this->IsFloat = IsFloat;
|
this->IsFloat = IsFloat;
|
||||||
|
|
||||||
if (!is_open())
|
if (!is_open())
|
||||||
throw "Blerror";
|
throw "Failed to open destination file for writing";
|
||||||
|
|
||||||
WriteHeader(true, IsFloat);
|
WriteHeader(true, IsFloat);
|
||||||
}
|
}
|
||||||
|
@ -59,7 +62,7 @@ Wave64Writer::~Wave64Writer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Wave64Writer::WriteHeader(bool Initial, bool IsFloat) {
|
void Wave64Writer::WriteHeader(bool Initial, bool IsFloat) {
|
||||||
WAVEFORMATEX WFEX;
|
FFMS_WAVEFORMATEX WFEX;
|
||||||
if (IsFloat)
|
if (IsFloat)
|
||||||
WFEX.wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
|
WFEX.wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
|
||||||
else
|
else
|
||||||
|
|
|
@ -21,21 +21,30 @@
|
||||||
#ifndef WAVE64WRITER_H
|
#ifndef WAVE64WRITER_H
|
||||||
#define WAVE64WRITER_H
|
#define WAVE64WRITER_H
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include <vfw.h>
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
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:
|
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();
|
~Wave64Writer();
|
||||||
void WriteData(void *Data, std::streamsize Length);
|
void WriteData(void *Data, std::streamsize Length);
|
||||||
private:
|
private:
|
||||||
WORD BitsPerSample;
|
int32_t BitsPerSample;
|
||||||
WORD Channels;
|
int32_t Channels;
|
||||||
DWORD SamplesPerSec;
|
uint32_t SamplesPerSec;
|
||||||
uint64_t BytesWritten;
|
uint64_t BytesWritten;
|
||||||
uint32_t HeaderSize;
|
uint32_t HeaderSize;
|
||||||
bool IsFloat;
|
bool IsFloat;
|
||||||
|
|
Loading…
Reference in New Issue