9 // for avi_stream_id():
10 #include "stream/stream.h"
13 #include "aviheader.h"
16 //#include "codec-cfg.h"
17 //#include "stheader.h"
19 void print_avih_flags(MainAVIHeader
*h
, int verbose_level
){
20 mp_msg(MSGT_HEADER
, verbose_level
, "MainAVIHeader.dwFlags: (%"PRId32
")%s%s%s%s%s%s\n",h
->dwFlags
,
21 (h
->dwFlags
&AVIF_HASINDEX
)?" HAS_INDEX":"",
22 (h
->dwFlags
&AVIF_MUSTUSEINDEX
)?" MUST_USE_INDEX":"",
23 (h
->dwFlags
&AVIF_ISINTERLEAVED
)?" IS_INTERLEAVED":"",
24 (h
->dwFlags
&AVIF_TRUSTCKTYPE
)?" TRUST_CKTYPE":"",
25 (h
->dwFlags
&AVIF_WASCAPTUREFILE
)?" WAS_CAPTUREFILE":"",
26 (h
->dwFlags
&AVIF_COPYRIGHTED
)?" COPYRIGHTED":""
30 void print_avih(MainAVIHeader
*h
, int verbose_level
){
31 mp_msg(MSGT_HEADER
, verbose_level
, "======= AVI Header =======\n");
32 mp_msg(MSGT_HEADER
, verbose_level
, "us/frame: %"PRId32
" (fps=%5.3f)\n",h
->dwMicroSecPerFrame
,1000000.0f
/(float)h
->dwMicroSecPerFrame
);
33 mp_msg(MSGT_HEADER
, verbose_level
, "max bytes/sec: %"PRId32
"\n",h
->dwMaxBytesPerSec
);
34 mp_msg(MSGT_HEADER
, verbose_level
, "padding: %"PRId32
"\n",h
->dwPaddingGranularity
);
35 print_avih_flags(h
, verbose_level
);
36 mp_msg(MSGT_HEADER
, verbose_level
, "frames total: %"PRId32
" initial: %"PRId32
"\n",h
->dwTotalFrames
,h
->dwInitialFrames
);
37 mp_msg(MSGT_HEADER
, verbose_level
, "streams: %"PRId32
"\n",h
->dwStreams
);
38 mp_msg(MSGT_HEADER
, verbose_level
, "Suggested BufferSize: %"PRId32
"\n",h
->dwSuggestedBufferSize
);
39 mp_msg(MSGT_HEADER
, verbose_level
, "Size: %"PRId32
" x %"PRId32
"\n",h
->dwWidth
,h
->dwHeight
);
40 mp_msg(MSGT_HEADER
, verbose_level
, "==========================\n");
43 void print_strh(AVIStreamHeader
*h
, int verbose_level
){
44 mp_msg(MSGT_HEADER
, verbose_level
, "====== STREAM Header =====\n");
45 mp_msg(MSGT_HEADER
, verbose_level
, "Type: %.4s FCC: %.4s (%X)\n",(char *)&h
->fccType
,(char *)&h
->fccHandler
,(unsigned int)h
->fccHandler
);
46 mp_msg(MSGT_HEADER
, verbose_level
, "Flags: %"PRId32
"\n",h
->dwFlags
);
47 mp_msg(MSGT_HEADER
, verbose_level
, "Priority: %d Language: %d\n",h
->wPriority
,h
->wLanguage
);
48 mp_msg(MSGT_HEADER
, verbose_level
, "InitialFrames: %"PRId32
"\n",h
->dwInitialFrames
);
49 mp_msg(MSGT_HEADER
, verbose_level
, "Rate: %"PRId32
"/%"PRId32
" = %5.3f\n",h
->dwRate
,h
->dwScale
,(float)h
->dwRate
/(float)h
->dwScale
);
50 mp_msg(MSGT_HEADER
, verbose_level
, "Start: %"PRId32
" Len: %"PRId32
"\n",h
->dwStart
,h
->dwLength
);
51 mp_msg(MSGT_HEADER
, verbose_level
, "Suggested BufferSize: %"PRId32
"\n",h
->dwSuggestedBufferSize
);
52 mp_msg(MSGT_HEADER
, verbose_level
, "Quality %"PRId32
"\n",h
->dwQuality
);
53 mp_msg(MSGT_HEADER
, verbose_level
, "Sample size: %"PRId32
"\n",h
->dwSampleSize
);
54 mp_msg(MSGT_HEADER
, verbose_level
, "==========================\n");
57 void print_wave_header(WAVEFORMATEX
*h
, int verbose_level
){
58 mp_msg(MSGT_HEADER
, verbose_level
, "======= WAVE Format =======\n");
59 mp_msg(MSGT_HEADER
, verbose_level
, "Format Tag: %d (0x%X)\n",h
->wFormatTag
,h
->wFormatTag
);
60 mp_msg(MSGT_HEADER
, verbose_level
, "Channels: %d\n",h
->nChannels
);
61 mp_msg(MSGT_HEADER
, verbose_level
, "Samplerate: %"PRId32
"\n",h
->nSamplesPerSec
);
62 mp_msg(MSGT_HEADER
, verbose_level
, "avg byte/sec: %"PRId32
"\n",h
->nAvgBytesPerSec
);
63 mp_msg(MSGT_HEADER
, verbose_level
, "Block align: %d\n",h
->nBlockAlign
);
64 mp_msg(MSGT_HEADER
, verbose_level
, "bits/sample: %d\n",h
->wBitsPerSample
);
65 mp_msg(MSGT_HEADER
, verbose_level
, "cbSize: %d\n",h
->cbSize
);
66 if(h
->wFormatTag
==0x55 && h
->cbSize
>=12){
67 MPEGLAYER3WAVEFORMAT
* h2
=(MPEGLAYER3WAVEFORMAT
*)h
;
68 mp_msg(MSGT_HEADER
, verbose_level
, "mp3.wID=%d\n",h2
->wID
);
69 mp_msg(MSGT_HEADER
, verbose_level
, "mp3.fdwFlags=0x%"PRIX32
"\n",h2
->fdwFlags
);
70 mp_msg(MSGT_HEADER
, verbose_level
, "mp3.nBlockSize=%d\n",h2
->nBlockSize
);
71 mp_msg(MSGT_HEADER
, verbose_level
, "mp3.nFramesPerBlock=%d\n",h2
->nFramesPerBlock
);
72 mp_msg(MSGT_HEADER
, verbose_level
, "mp3.nCodecDelay=%d\n",h2
->nCodecDelay
);
74 else if (h
->cbSize
> 0)
77 uint8_t* p
= (uint8_t*)(h
+ 1);
78 mp_msg(MSGT_HEADER
, verbose_level
, "Unknown extra header dump: ");
79 for (i
= 0; i
< h
->cbSize
; i
++)
80 mp_msg(MSGT_HEADER
, verbose_level
, "[%x] ", p
[i
]);
81 mp_msg(MSGT_HEADER
, verbose_level
, "\n");
83 mp_msg(MSGT_HEADER
, verbose_level
, "==========================================================================\n");
87 void print_video_header(BITMAPINFOHEADER
*h
, int verbose_level
){
88 mp_msg(MSGT_HEADER
, verbose_level
, "======= VIDEO Format ======\n");
89 mp_msg(MSGT_HEADER
, verbose_level
, " biSize %d\n", h
->biSize
);
90 mp_msg(MSGT_HEADER
, verbose_level
, " biWidth %d\n", h
->biWidth
);
91 mp_msg(MSGT_HEADER
, verbose_level
, " biHeight %d\n", h
->biHeight
);
92 mp_msg(MSGT_HEADER
, verbose_level
, " biPlanes %d\n", h
->biPlanes
);
93 mp_msg(MSGT_HEADER
, verbose_level
, " biBitCount %d\n", h
->biBitCount
);
94 mp_msg(MSGT_HEADER
, verbose_level
, " biCompression %d='%.4s'\n", h
->biCompression
, (char *)&h
->biCompression
);
95 mp_msg(MSGT_HEADER
, verbose_level
, " biSizeImage %d\n", h
->biSizeImage
);
96 if (h
->biSize
> sizeof(BITMAPINFOHEADER
))
99 uint8_t* p
= (uint8_t*)(h
+ 1);
100 mp_msg(MSGT_HEADER
, verbose_level
, "Unknown extra header dump: ");
101 for (i
= 0; i
< h
->biSize
-sizeof(BITMAPINFOHEADER
); i
++)
102 mp_msg(MSGT_HEADER
, verbose_level
, "[%x] ", *(p
+i
));
103 mp_msg(MSGT_HEADER
, verbose_level
, "\n");
105 mp_msg(MSGT_HEADER
, verbose_level
, "===========================\n");
108 void print_vprp(VideoPropHeader
*vprp
, int verbose_level
){
110 mp_msg(MSGT_HEADER
, verbose_level
, "======= Video Properties Header =======\n");
111 mp_msg(MSGT_HEADER
, verbose_level
, "Format: %d VideoStandard: %d\n",
112 vprp
->VideoFormatToken
,vprp
->VideoStandard
);
113 mp_msg(MSGT_HEADER
, verbose_level
, "VRefresh: %d HTotal: %d VTotal: %d\n",
114 vprp
->dwVerticalRefreshRate
, vprp
->dwHTotalInT
, vprp
->dwVTotalInLines
);
115 mp_msg(MSGT_HEADER
, verbose_level
, "FrameAspect: %d:%d Framewidth: %d Frameheight: %d\n",
116 vprp
->dwFrameAspectRatio
>> 16, vprp
->dwFrameAspectRatio
& 0xffff,
117 vprp
->dwFrameWidthInPixels
, vprp
->dwFrameHeightInLines
);
118 mp_msg(MSGT_HEADER
, verbose_level
, "Fields: %d\n", vprp
->nbFieldPerFrame
);
119 for (i
=0; i
<vprp
->nbFieldPerFrame
; i
++) {
120 VIDEO_FIELD_DESC
*vfd
= &vprp
->FieldInfo
[i
];
121 mp_msg(MSGT_HEADER
, verbose_level
, " == Field %d description ==\n", i
);
122 mp_msg(MSGT_HEADER
, verbose_level
, " CompressedBMHeight: %d CompressedBMWidth: %d\n",
123 vfd
->CompressedBMHeight
, vfd
->CompressedBMWidth
);
124 mp_msg(MSGT_HEADER
, verbose_level
, " ValidBMHeight: %d ValidBMWidth: %d\n",
125 vfd
->ValidBMHeight
, vfd
->ValidBMWidth
);
126 mp_msg(MSGT_HEADER
, verbose_level
, " ValidBMXOffset: %d ValidBMYOffset: %d\n",
127 vfd
->ValidBMXOffset
, vfd
->ValidBMYOffset
);
128 mp_msg(MSGT_HEADER
, verbose_level
, " VideoXOffsetInT: %d VideoYValidStartLine: %d\n",
129 vfd
->VideoXOffsetInT
, vfd
->VideoYValidStartLine
);
131 mp_msg(MSGT_HEADER
, verbose_level
, "=======================================\n");
134 void print_index(AVIINDEXENTRY
*idx
, int idx_size
, int verbose_level
){
136 unsigned int pos
[256];
137 unsigned int num
[256];
138 memset(pos
, 0, sizeof(pos
));
139 memset(num
, 0, sizeof(num
));
140 for(i
=0;i
<idx_size
;i
++){
141 int id
=avi_stream_id(idx
[i
].ckid
);
142 if(id
<0 || id
>255) id
=255;
143 mp_msg(MSGT_HEADER
, verbose_level
, "%5d: %.4s %4X %016"PRIX64
" len:%6"PRId32
" pos:%7d->%7.3f %7d->%7.3f\n",i
,
144 (char *)&idx
[i
].ckid
,
145 (unsigned int)idx
[i
].dwFlags
&0xffff,
146 (uint64_t)AVI_IDX_OFFSET(&idx
[i
]),
147 // idx[i].dwChunkOffset+demuxer->movi_start,
148 idx
[i
].dwChunkLength
,
149 pos
[id
],(float)pos
[id
]/18747.0f
,
150 num
[id
],(float)num
[id
]/23.976f
152 pos
[id
]+=idx
[i
].dwChunkLength
;
157 void print_avistdindex_chunk(avistdindex_chunk
*h
, int verbose_level
){
158 mp_msg (MSGT_HEADER
, verbose_level
, "====== AVI Standard Index Header ========\n");
159 mp_msg (MSGT_HEADER
, verbose_level
, " FCC (%.4s) dwSize (%d) wLongsPerEntry(%d)\n", h
->fcc
, h
->dwSize
, h
->wLongsPerEntry
);
160 mp_msg (MSGT_HEADER
, verbose_level
, " bIndexSubType (%d) bIndexType (%d)\n", h
->bIndexSubType
, h
->bIndexType
);
161 mp_msg (MSGT_HEADER
, verbose_level
, " nEntriesInUse (%d) dwChunkId (%.4s)\n", h
->nEntriesInUse
, h
->dwChunkId
);
162 mp_msg (MSGT_HEADER
, verbose_level
, " qwBaseOffset (0x%"PRIX64
") dwReserved3 (%d)\n", h
->qwBaseOffset
, h
->dwReserved3
);
163 mp_msg (MSGT_HEADER
, verbose_level
, "===========================\n");
165 void print_avisuperindex_chunk(avisuperindex_chunk
*h
, int verbose_level
){
166 mp_msg (MSGT_HEADER
, verbose_level
, "====== AVI Super Index Header ========\n");
167 mp_msg (MSGT_HEADER
, verbose_level
, " FCC (%.4s) dwSize (%d) wLongsPerEntry(%d)\n", h
->fcc
, h
->dwSize
, h
->wLongsPerEntry
);
168 mp_msg (MSGT_HEADER
, verbose_level
, " bIndexSubType (%d) bIndexType (%d)\n", h
->bIndexSubType
, h
->bIndexType
);
169 mp_msg (MSGT_HEADER
, verbose_level
, " nEntriesInUse (%d) dwChunkId (%.4s)\n", h
->nEntriesInUse
, h
->dwChunkId
);
170 mp_msg (MSGT_HEADER
, verbose_level
, " dwReserved[0] (%d) dwReserved[1] (%d) dwReserved[2] (%d)\n",
171 h
->dwReserved
[0], h
->dwReserved
[1], h
->dwReserved
[2]);
172 mp_msg (MSGT_HEADER
, verbose_level
, "===========================\n");