Skip to content

Commit 21d2744

Browse files
committed
BMRawAVIv210ToDng project
1 parent 20c3361 commit 21d2744

File tree

17 files changed

+627
-6
lines changed

17 files changed

+627
-6
lines changed

BMRawAVIv210ToDng/AviMainHeader.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace BMRawAVIv210ToDng {
8+
class AviMainHeader {
9+
public static AviMainHeader Read(FourCCHeader fcc, BinaryReader br) {
10+
var r = new AviMainHeader();
11+
12+
r.fcc = fcc.fourcc;
13+
r.cb = fcc.bytes;
14+
15+
if (0 != r.fcc.CompareTo("avih")
16+
|| 56 != r.cb) {
17+
throw new ArgumentException("AviMainHeader fourcc/size mismatch");
18+
}
19+
20+
r.dwMicroSecPerFrame = br.ReadUInt32();
21+
r.dwMaxBytesPersec = br.ReadUInt32();
22+
r.dwPaddingGranularity = br.ReadUInt32();
23+
r.dwFlags = br.ReadUInt32();
24+
25+
r.dwTotalFrames = br.ReadUInt32();
26+
r.dwInitialFrames = br.ReadUInt32();
27+
r.dwStreams = br.ReadUInt32();
28+
r.dwSuggestedBufferSize = br.ReadUInt32();
29+
r.dwWidth = br.ReadUInt32();
30+
31+
r.dwHeight = br.ReadUInt32();
32+
r.dwReserved0 = br.ReadUInt32();
33+
r.dwReserved1 = br.ReadUInt32();
34+
r.dwReserved2 = br.ReadUInt32();
35+
r.dwReserved3 = br.ReadUInt32();
36+
return r;
37+
}
38+
39+
public string fcc;
40+
public uint cb;
41+
public uint dwMicroSecPerFrame;
42+
public uint dwMaxBytesPersec;
43+
public uint dwPaddingGranularity;
44+
public uint dwFlags;
45+
46+
public uint dwTotalFrames;
47+
public uint dwInitialFrames;
48+
public uint dwStreams;
49+
public uint dwSuggestedBufferSize;
50+
public uint dwWidth;
51+
52+
public uint dwHeight;
53+
public uint dwReserved0;
54+
public uint dwReserved1;
55+
public uint dwReserved2;
56+
public uint dwReserved3;
57+
}
58+
}

BMRawAVIv210ToDng/AviReader.cs

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace BMRawAVIv210ToDng
8+
{
9+
class AviReader : IDisposable {
10+
public class PositionAndSize {
11+
public long position;
12+
public uint bytes;
13+
};
14+
15+
/* RIFF "AVI "
16+
LIST "hdrl"
17+
avih AviMainHeader
18+
LIST "strl"
19+
strh AviStreamHeader
20+
strf BitmapInfoHeader
21+
LIST "movi"
22+
00db
23+
00db
24+
...
25+
RIFF "AVIX"
26+
LIST "movi"
27+
00db
28+
00db
29+
...
30+
*/
31+
32+
public bool Open(string path) {
33+
mImagePos.Clear();
34+
35+
mBr = new BinaryReader(new FileStream(path, FileMode.Open, FileAccess.Read));
36+
37+
var riffHeader = RiffHeader.Read(mBr);
38+
if (0 != riffHeader.riff.CompareTo("RIFF")
39+
|| 0!= riffHeader.type.CompareTo("AVI ")) {
40+
Console.WriteLine("E: this is not AVI");
41+
return false;
42+
}
43+
44+
try {
45+
do {
46+
var fcc = FourCCHeader.Read(mBr);
47+
switch (fcc.fourcc) {
48+
case "RIFF":
49+
var riffType = Common.ReadFourCC(mBr);
50+
if (0 != riffType.CompareTo("AVIX")) {
51+
Console.WriteLine("D: Unknown Riff {0}", riffType);
52+
}
53+
break;
54+
case "LIST":
55+
var lst = ListHeader.Read(fcc, mBr);
56+
break;
57+
case "avih":
58+
mAviMainHeader = AviMainHeader.Read(fcc, mBr);
59+
break;
60+
case "strh":
61+
mAviStreamHeader = AviStreamHeader.Read(fcc, mBr);
62+
break;
63+
case "strf":
64+
if (0 == mAviStreamHeader.fccType.CompareTo("vids")) {
65+
mBmpih = BitmapInfoHeader.Read(fcc, mBr);
66+
}
67+
break;
68+
case "00db":
69+
case "00dc":
70+
ReadOneImage(fcc);
71+
break;
72+
default:
73+
SkipUnknownHeader(fcc);
74+
break;
75+
}
76+
} while (true);
77+
} catch (EndOfStreamException) {
78+
// OK
79+
}
80+
81+
Console.WriteLine("Total {0} images", mImagePos.Count);
82+
83+
if (mImagePos.Count == 0) {
84+
Close();
85+
return false;
86+
}
87+
88+
return true;
89+
}
90+
91+
public void Close() {
92+
if (mBr != null) {
93+
mBr.Close();
94+
mBr = null;
95+
}
96+
}
97+
98+
public void ReadOneImage(FourCCHeader fcc) {
99+
PositionAndSize ps = new PositionAndSize();
100+
ps.bytes = fcc.bytes;
101+
ps.position = mBr.BaseStream.Position;
102+
mImagePos.Add(ps);
103+
104+
mBr.BaseStream.Seek(fcc.bytes, SeekOrigin.Current);
105+
}
106+
107+
public void SkipUnknownHeader(FourCCHeader fcc) {
108+
mBr.BaseStream.Seek(fcc.bytes, SeekOrigin.Current);
109+
}
110+
111+
public int NumImages {
112+
get {
113+
return mImagePos.Count;
114+
}
115+
}
116+
117+
public byte[] GetNthImage(int nth) {
118+
var ps = mImagePos[nth];
119+
mBr.BaseStream.Seek(ps.position, SeekOrigin.Begin);
120+
return mBr.ReadBytes((int)ps.bytes);
121+
}
122+
123+
public AviMainHeader mAviMainHeader;
124+
public AviStreamHeader mAviStreamHeader;
125+
public BitmapInfoHeader mBmpih;
126+
public BinaryReader mBr = null;
127+
128+
public List<PositionAndSize> mImagePos = new List<PositionAndSize>();
129+
130+
#region IDisposable Support
131+
private bool disposedValue = false; // To detect redundant calls
132+
133+
protected virtual void Dispose(bool disposing) {
134+
if (!disposedValue) {
135+
if (disposing) {
136+
// TODO: dispose managed state (managed objects).
137+
Close();
138+
}
139+
140+
// TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
141+
// TODO: set large fields to null.
142+
143+
disposedValue = true;
144+
}
145+
}
146+
147+
// TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
148+
// ~AviReader() {
149+
// // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
150+
// Dispose(false);
151+
// }
152+
153+
// This code added to correctly implement the disposable pattern.
154+
public void Dispose() {
155+
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
156+
Dispose(true);
157+
// TODO: uncomment the following line if the finalizer is overridden above.
158+
// GC.SuppressFinalize(this);
159+
}
160+
#endregion
161+
}
162+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace BMRawAVIv210ToDng {
8+
class AviStreamHeader {
9+
public static AviStreamHeader Read(FourCCHeader fcc, BinaryReader br) {
10+
var r = new AviStreamHeader();
11+
r.fcc = fcc.fourcc;
12+
r.cb = fcc.bytes;
13+
14+
if (0 != r.fcc.CompareTo("strh")
15+
|| 56 != r.cb) {
16+
throw new ArgumentException("AviStreamHeader fourcc/size mismatch");
17+
}
18+
19+
r.fccType = Common.ReadFourCC(br);
20+
r.fccHandler = Common.ReadFourCC(br);
21+
r.dwFlags = br.ReadUInt32();
22+
r.wPriority = br.ReadUInt16();
23+
r.wLanguage = br.ReadUInt16();
24+
25+
r.dwInitialFrames = br.ReadUInt32();
26+
r.dwScale = br.ReadUInt32();
27+
r.dwRate = br.ReadUInt32();
28+
r.dwStart = br.ReadUInt32();
29+
r.dwLength = br.ReadUInt32();
30+
31+
r.dwSuggestedBufferSize = br.ReadUInt32();
32+
r.dwQuality = br.ReadUInt32();
33+
r.dwSampleSize = br.ReadUInt32();
34+
35+
r.left = br.ReadInt16();
36+
r.top = br.ReadInt16();
37+
38+
r.right = br.ReadInt16();
39+
r.bottom = br.ReadInt16();
40+
41+
return r;
42+
}
43+
44+
public string fcc; //< "strh"
45+
public uint cb;
46+
47+
public string fccType;
48+
public string fccHandler;
49+
public uint dwFlags;
50+
public ushort wPriority;
51+
public ushort wLanguage;
52+
53+
public uint dwInitialFrames;
54+
public uint dwScale;
55+
public uint dwRate;
56+
public uint dwStart;
57+
public uint dwLength;
58+
59+
public uint dwSuggestedBufferSize;
60+
public uint dwQuality;
61+
public uint dwSampleSize;
62+
public short left;
63+
public short top;
64+
65+
public short right;
66+
public short bottom;
67+
}
68+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace BMRawAVIv210ToDng {
8+
class BitmapInfoHeader {
9+
public static BitmapInfoHeader Read(FourCCHeader fcc, BinaryReader br) {
10+
if (0 != fcc.fourcc.CompareTo("strf")
11+
|| 40 != fcc.bytes) {
12+
throw new ArgumentException("BitmapInfoHeader fourcc/size mismatch");
13+
}
14+
15+
var r = new BitmapInfoHeader();
16+
17+
r.biSize = br.ReadUInt32();
18+
r.biWidth = br.ReadInt32();
19+
r.biHeight = br.ReadInt32();
20+
r.biPlanes = br.ReadInt16();
21+
r.biBitCount = br.ReadInt16();
22+
23+
r.biCompression = br.ReadUInt32();
24+
r.biSizeImage = br.ReadUInt32();
25+
r.biXPelsPerMeter = br.ReadInt32();
26+
r.biYPelsPerMeter = br.ReadInt32();
27+
r.biClrUsed = br.ReadUInt32();
28+
29+
r.biClrImportant = br.ReadUInt32();
30+
return r;
31+
}
32+
33+
public uint biSize;
34+
public int biWidth;
35+
public int biHeight;
36+
public short biPlanes;
37+
public short biBitCount;
38+
39+
public uint biCompression;
40+
public uint biSizeImage;
41+
public int biXPelsPerMeter;
42+
public int biYPelsPerMeter;
43+
public uint biClrUsed;
44+
45+
public uint biClrImportant;
46+
}
47+
}

BMRawAVIv210ToDng/CMakeLists.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
cmake_minimum_required(VERSION 3.8)
2+
3+
project(BMRawAVIv210ToDng LANGUAGES CSharp)
4+
5+
include(CSharpUtilities)
6+
7+
add_executable(BMRawAVIv210ToDng
8+
Properties/AssemblyInfo.cs
9+
Convert.cs
10+
AviReader.cs
11+
Common.cs
12+
RiffHeader.cs
13+
ListHeader.cs
14+
BitmapInfoHeader.cs
15+
AviMainHeader.cs
16+
AviStreamHeader.cs
17+
FourCCHeader.cs
18+
Program.cs)
19+
20+
csharp_set_designer_cs_properties(
21+
Properties/AssemblyInfo.cs)
22+
23+
# This project uses DngRW library
24+
target_link_libraries(BMRawAVIv210ToDng DngRW)
25+
26+
set_property(TARGET BMRawAVIv210ToDng PROPERTY VS_DOTNET_REFERENCES
27+
"Microsoft.CSharp"
28+
"System"
29+
"System.Core"
30+
"WindowsBase")

BMRawAVIv210ToDng/Common.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace BMRawAVIv210ToDng
8+
{
9+
class Common {
10+
public static string ReadFourCC(BinaryReader br) {
11+
var b = br.ReadBytes(4);
12+
if (b.Length < 4) {
13+
throw new EndOfStreamException("Common.ReadFourCC");
14+
}
15+
16+
var c = new char[4];
17+
for (int i = 0; i < 4; ++i) {
18+
c[i] = (char)b[i];
19+
}
20+
21+
return new string(c);
22+
}
23+
}
24+
}

0 commit comments

Comments
 (0)