Skip to content

Commit 8b83dd2

Browse files
committed
HDR10Capture recoded r210 AVI to OpenEXR sequence
1 parent 5efdc70 commit 8b83dd2

File tree

11 files changed

+352
-20
lines changed

11 files changed

+352
-20
lines changed

AviToExrSequence/AviToExrSequence.sln

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 16
4+
VisualStudioVersion = 16.0.30804.86
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AviToExrSequence", "AviToExrSequence.vcxproj", "{0F07AD54-F5E0-4C61-A896-AED4CA489784}"
7+
EndProject
8+
Global
9+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
10+
Debug|x64 = Debug|x64
11+
Release|x64 = Release|x64
12+
EndGlobalSection
13+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
14+
{0F07AD54-F5E0-4C61-A896-AED4CA489784}.Debug|x64.ActiveCfg = Debug|x64
15+
{0F07AD54-F5E0-4C61-A896-AED4CA489784}.Debug|x64.Build.0 = Debug|x64
16+
{0F07AD54-F5E0-4C61-A896-AED4CA489784}.Release|x64.ActiveCfg = Release|x64
17+
{0F07AD54-F5E0-4C61-A896-AED4CA489784}.Release|x64.Build.0 = Release|x64
18+
EndGlobalSection
19+
GlobalSection(SolutionProperties) = preSolution
20+
HideSolutionNode = FALSE
21+
EndGlobalSection
22+
GlobalSection(ExtensibilityGlobals) = postSolution
23+
SolutionGuid = {E66B73D9-7C94-41F8-8BCB-840748BF4DFF}
24+
EndGlobalSection
25+
EndGlobal
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<ItemGroup Label="ProjectConfigurations">
4+
<ProjectConfiguration Include="Debug|x64">
5+
<Configuration>Debug</Configuration>
6+
<Platform>x64</Platform>
7+
</ProjectConfiguration>
8+
<ProjectConfiguration Include="Release|x64">
9+
<Configuration>Release</Configuration>
10+
<Platform>x64</Platform>
11+
</ProjectConfiguration>
12+
</ItemGroup>
13+
<PropertyGroup Label="Globals">
14+
<VCProjectVersion>16.0</VCProjectVersion>
15+
<Keyword>Win32Proj</Keyword>
16+
<ProjectGuid>{0f07ad54-f5e0-4c61-a896-aed4ca489784}</ProjectGuid>
17+
<RootNamespace>AviToExrSequence</RootNamespace>
18+
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
19+
</PropertyGroup>
20+
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
21+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
22+
<ConfigurationType>Application</ConfigurationType>
23+
<UseDebugLibraries>true</UseDebugLibraries>
24+
<PlatformToolset>v142</PlatformToolset>
25+
<CharacterSet>Unicode</CharacterSet>
26+
</PropertyGroup>
27+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
28+
<ConfigurationType>Application</ConfigurationType>
29+
<UseDebugLibraries>false</UseDebugLibraries>
30+
<PlatformToolset>v142</PlatformToolset>
31+
<WholeProgramOptimization>true</WholeProgramOptimization>
32+
<CharacterSet>Unicode</CharacterSet>
33+
</PropertyGroup>
34+
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
35+
<ImportGroup Label="ExtensionSettings">
36+
</ImportGroup>
37+
<ImportGroup Label="Shared">
38+
</ImportGroup>
39+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
40+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
41+
</ImportGroup>
42+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
43+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
44+
</ImportGroup>
45+
<PropertyGroup Label="UserMacros" />
46+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
47+
<LinkIncremental>true</LinkIncremental>
48+
<LibraryPath>..\HDR10Capture2019\Contrib\lib;$(LibraryPath)</LibraryPath>
49+
</PropertyGroup>
50+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
51+
<LinkIncremental>false</LinkIncremental>
52+
<LibraryPath>..\HDR10Capture2019\Contrib\lib;$(LibraryPath)</LibraryPath>
53+
</PropertyGroup>
54+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
55+
<ClCompile>
56+
<WarningLevel>Level3</WarningLevel>
57+
<SDLCheck>true</SDLCheck>
58+
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
59+
<ConformanceMode>true</ConformanceMode>
60+
<AdditionalIncludeDirectories>..\HDR10Capture2019;..\HDR10Capture2019\Contrib\include;..\HDR10Capture2019\Contrib\include\OpenEXR</AdditionalIncludeDirectories>
61+
</ClCompile>
62+
<Link>
63+
<SubSystem>Console</SubSystem>
64+
<GenerateDebugInformation>true</GenerateDebugInformation>
65+
<AdditionalDependencies>Shlwapi.lib;libpng16_staticd.lib;zlibstaticd.lib;Imath-2_5_static_d.lib;IlmThread-2_5_static_d.lib;IlmImfUtil-2_5_static_d.lib;IlmImf-2_5_static_d.lib;IexMath-2_5_static_d.lib;Iex-2_5_static_d.lib;Half-2_5_static_d.lib;d3d12.lib;dxgi.lib;d3dcompiler.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
66+
</Link>
67+
</ItemDefinitionGroup>
68+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
69+
<ClCompile>
70+
<WarningLevel>Level3</WarningLevel>
71+
<FunctionLevelLinking>true</FunctionLevelLinking>
72+
<IntrinsicFunctions>true</IntrinsicFunctions>
73+
<SDLCheck>true</SDLCheck>
74+
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
75+
<ConformanceMode>true</ConformanceMode>
76+
<AdditionalIncludeDirectories>..\HDR10Capture2019;..\HDR10Capture2019\Contrib\include;..\HDR10Capture2019\Contrib\include\OpenEXR</AdditionalIncludeDirectories>
77+
</ClCompile>
78+
<Link>
79+
<SubSystem>Console</SubSystem>
80+
<EnableCOMDATFolding>true</EnableCOMDATFolding>
81+
<OptimizeReferences>true</OptimizeReferences>
82+
<GenerateDebugInformation>true</GenerateDebugInformation>
83+
<AdditionalDependencies>Shlwapi.lib;libpng16_static.lib;zlibstatic.lib;Imath-2_5_static.lib;IlmThread-2_5_static.lib;IlmImfUtil-2_5_static.lib;IlmImf-2_5_static.lib;IexMath-2_5_static.lib;Iex-2_5_static.lib;Half-2_5_static.lib;d3d12.lib;dxgi.lib;d3dcompiler.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
84+
</Link>
85+
</ItemDefinitionGroup>
86+
<ItemGroup>
87+
<ClCompile Include="..\HDR10Capture2019\MLAviCommon.cpp" />
88+
<ClCompile Include="..\HDR10Capture2019\MLAviReader.cpp" />
89+
<ClCompile Include="..\HDR10Capture2019\MLAviWriter.cpp" />
90+
<ClCompile Include="..\HDR10Capture2019\MLConverter.cpp" />
91+
<ClCompile Include="..\HDR10Capture2019\MLExrWriter.cpp" />
92+
<ClCompile Include="..\HDR10Capture2019\MLImage.cpp" />
93+
<ClCompile Include="Main.cpp" />
94+
</ItemGroup>
95+
<ItemGroup>
96+
<ClInclude Include="..\HDR10Capture2019\MLAVICommon.h" />
97+
<ClInclude Include="..\HDR10Capture2019\MLAviReader.h" />
98+
<ClInclude Include="..\HDR10Capture2019\MLAviWriter.h" />
99+
<ClInclude Include="..\HDR10Capture2019\MLConverter.h" />
100+
<ClInclude Include="..\HDR10Capture2019\MLExrWriter.h" />
101+
<ClInclude Include="..\HDR10Capture2019\MLImage.h" />
102+
</ItemGroup>
103+
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
104+
<ImportGroup Label="ExtensionTargets">
105+
</ImportGroup>
106+
</Project>
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<ItemGroup>
4+
<Filter Include="Source Files">
5+
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
6+
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
7+
</Filter>
8+
<Filter Include="Header Files">
9+
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
10+
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
11+
</Filter>
12+
<Filter Include="Resource Files">
13+
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
14+
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
15+
</Filter>
16+
<Filter Include="HDR10Capture">
17+
<UniqueIdentifier>{5f731e82-8318-4c1e-9cf4-13299cb343bf}</UniqueIdentifier>
18+
</Filter>
19+
</ItemGroup>
20+
<ItemGroup>
21+
<ClCompile Include="..\HDR10Capture2019\MLAviCommon.cpp">
22+
<Filter>HDR10Capture</Filter>
23+
</ClCompile>
24+
<ClCompile Include="..\HDR10Capture2019\MLAviReader.cpp">
25+
<Filter>HDR10Capture</Filter>
26+
</ClCompile>
27+
<ClCompile Include="..\HDR10Capture2019\MLAviWriter.cpp">
28+
<Filter>HDR10Capture</Filter>
29+
</ClCompile>
30+
<ClCompile Include="..\HDR10Capture2019\MLExrWriter.cpp">
31+
<Filter>HDR10Capture</Filter>
32+
</ClCompile>
33+
<ClCompile Include="..\HDR10Capture2019\MLImage.cpp">
34+
<Filter>HDR10Capture</Filter>
35+
</ClCompile>
36+
<ClCompile Include="..\HDR10Capture2019\MLConverter.cpp">
37+
<Filter>HDR10Capture</Filter>
38+
</ClCompile>
39+
<ClCompile Include="Main.cpp">
40+
<Filter>Source Files</Filter>
41+
</ClCompile>
42+
</ItemGroup>
43+
<ItemGroup>
44+
<ClInclude Include="..\HDR10Capture2019\MLAVICommon.h">
45+
<Filter>HDR10Capture</Filter>
46+
</ClInclude>
47+
<ClInclude Include="..\HDR10Capture2019\MLAviReader.h">
48+
<Filter>HDR10Capture</Filter>
49+
</ClInclude>
50+
<ClInclude Include="..\HDR10Capture2019\MLAviWriter.h">
51+
<Filter>HDR10Capture</Filter>
52+
</ClInclude>
53+
<ClInclude Include="..\HDR10Capture2019\MLExrWriter.h">
54+
<Filter>HDR10Capture</Filter>
55+
</ClInclude>
56+
<ClInclude Include="..\HDR10Capture2019\MLImage.h">
57+
<Filter>HDR10Capture</Filter>
58+
</ClInclude>
59+
<ClInclude Include="..\HDR10Capture2019\MLConverter.h">
60+
<Filter>HDR10Capture</Filter>
61+
</ClInclude>
62+
</ItemGroup>
63+
</Project>

AviToExrSequence/Main.cpp

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
#include <stdio.h>
2+
#include <Windows.h>
3+
#include "MLAviReader.h"
4+
#include "MLExrWriter.h"
5+
#include "MLAviCommon.h"
6+
#include "MLConverter.h"
7+
8+
static void
9+
PrintUsage(void) {
10+
printf("Usage:\n");
11+
printf(" to extract SDR image : AviToExrSequence - SDR input.avi outputExrPrefix\n");
12+
printf(" to extract HDR10 PQ image: AviToExrSequence -PQ input.avi outputExrPrefix\n");
13+
printf("Example: AviToExrSequence -PQ input.avi out : inputs input.avi and outputs out000001.exr, out000002.exr, ...\n");
14+
}
15+
16+
static bool
17+
Process(const wchar_t* inAviPath, const char* outExrPrefix, const bool PQ) {
18+
MLAviReader aviR;
19+
MLExrWriter exrW;
20+
MLConverter conv;
21+
22+
bool b = aviR.Open(inAviPath);
23+
if (!b) {
24+
printf("Error: File open error %S\n", inAviPath);
25+
return false;
26+
}
27+
28+
MLColorGamutType gamut = ML_CG_Rec709;
29+
MLImage::GammaType gamma = MLImage::MLG_G22;
30+
if (PQ) {
31+
gamut = ML_CG_Rec2020;
32+
gamma = MLImage::MLG_ST2084;
33+
}
34+
35+
uint8_t* buf = nullptr;
36+
37+
do {
38+
if (aviR.NumFrames() == 0) {
39+
printf("Error: AVI file does not contain image. %S\n", inAviPath);
40+
b = false;
41+
break;
42+
}
43+
44+
const MLBitmapInfoHeader& imgFmt = aviR.ImageFormat();
45+
if (imgFmt.biCompression != MLStringToFourCC("r210")) {
46+
printf("Error: Unsupported AVI image format %s. Only r210 is supported. %S\n",
47+
MLFourCCtoString(imgFmt.biCompression).c_str(),
48+
inAviPath);
49+
b = false;
50+
break;
51+
}
52+
53+
buf = new uint8_t[imgFmt.biSizeImage];
54+
55+
for (int i = 0; i < aviR.NumFrames(); ++i) {
56+
int rv = aviR.GetImage(i, imgFmt.biSizeImage, buf);
57+
if (rv != imgFmt.biSizeImage) {
58+
printf("Error: Read image #%d failed. %S\n",
59+
i,
60+
inAviPath);
61+
b = false;
62+
break;
63+
}
64+
65+
conv.Rgb10bitToR10G10B10A2(
66+
(const uint32_t*)buf,
67+
(uint32_t*)buf,
68+
imgFmt.biWidth, imgFmt.biHeight, 0xff);
69+
70+
MLImage mi;
71+
mi.Init(imgFmt.biWidth, imgFmt.biHeight,
72+
MLImage::IFFT_CapturedImg,
73+
MLImage::BFT_UIntR10G10B10A2,
74+
gamut, gamma,
75+
10, 3, imgFmt.biSizeImage, buf);
76+
77+
char outExrPath[MAX_PATH] = {};
78+
sprintf_s(outExrPath, "%s%06d.exr", outExrPrefix, i + 1);
79+
80+
rv = exrW.Write(outExrPath, mi);
81+
if (rv != S_OK) {
82+
printf("Error: Write image #%d failed. %s\n",
83+
i,
84+
outExrPath);
85+
b = false;
86+
break;
87+
}
88+
89+
printf(" Output %s\n", outExrPath);
90+
}
91+
92+
} while (false);
93+
94+
delete[] buf;
95+
buf = nullptr;
96+
97+
aviR.Close();
98+
return b;
99+
}
100+
101+
int
102+
main(int argc, char *argv[])
103+
{
104+
if (argc != 4) {
105+
PrintUsage();
106+
return 1;
107+
}
108+
109+
bool PQ = false;
110+
if (0 == strcmp("-PQ", argv[1])) {
111+
PQ = true;
112+
} else if (0 == strcmp("-SDR", argv[1])) {
113+
PQ = false;
114+
} else {
115+
printf("Error: Unknown command %s\n", argv[1]);
116+
PrintUsage();
117+
return 1;
118+
}
119+
120+
wchar_t inAviPath[MAX_PATH] = {};
121+
MultiByteToWideChar(CP_UTF8, 0, argv[2], -1, inAviPath, _countof(inAviPath) - 1);
122+
const char* outExrPrefix = argv[3];
123+
124+
bool b = Process(inAviPath, outExrPrefix, PQ);
125+
126+
return b ? 0 : 1;
127+
}
128+

HDR10Capture2019/MLAVICommon.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
#include <stdint.h>
44
#include <string>
55

6+
uint32_t MLStringToFourCC(const char* s);
7+
8+
const std::string MLFourCCtoString(uint32_t fourcc);
9+
610
enum MLAviImageFormat {
711
MLIF_Unknown,
812
MLIF_YUV422_v210,
@@ -127,7 +131,3 @@ struct MLStreamDataHeader {
127131
uint32_t bytes;
128132
};
129133

130-
uint32_t MLStringToFourCC(const char *s);
131-
132-
const std::string MLFourCCtoString(uint32_t fourcc);
133-

HDR10Capture2019/MLConverter.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,6 @@ MLConverter::MLConverter(void)
6868
}
6969
}
7070

71-
MLConverter::~MLConverter(void)
72-
{
73-
}
74-
7571
void
7672
MLConverter::Argb8bitToR8G8B8A8(const uint32_t* pFrom, uint32_t* pTo, const int width, const int height)
7773
{

HDR10Capture2019/MLConverter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
class MLConverter {
77
public:
88
MLConverter(void);
9-
~MLConverter(void);
9+
~MLConverter(void) { }
1010

1111
/// <summary>
1212
/// bmdFormat8BitARGB ¨ DXGI_FORMAT_R8G8B8A8_UNORM

HDR10Capture2019/MLDX12App.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1380,7 +1380,7 @@ MLDX12App::ShowImageFileRWWindow(void) {
13801380
break;
13811381
case ET_EXR:
13821382
if (ImGui::Button("Write EXR Image ##RF0", ImVec2(256, 48))) {
1383-
hr = MLExrWrite(mImgFilePath, mWriteImg);
1383+
hr = mExrWriter.Write(mImgFilePath, mWriteImg);
13841384

13851385
if (FAILED(hr)) {
13861386
sprintf_s(mErrorFileReadMsg, "Write Image Failed.\nFile Write error : %s", mImgFilePath);

HDR10Capture2019/MLDX12App.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "MLColorConvShaderConstants.h"
2121
#include "MLSaveSettings.h"
2222
#include "MLVideoCapUser.h"
23+
#include "MLExrWriter.h"
2324

2425

2526
using namespace DirectX;
@@ -212,4 +213,6 @@ class MLDX12App : public MLDX12 {
212213
/// mVCUから表示用キャプチャー画像を取り出し、mRenderImgとmWriteImgにセットする。
213214
/// </summary>
214215
void UpdateCaptureImg(void);
216+
217+
MLExrWriter mExrWriter;
215218
};

0 commit comments

Comments
 (0)