yading@10
|
1 /*
|
yading@10
|
2 * Directshow capture interface
|
yading@10
|
3 * Copyright (c) 2010 Ramiro Polla
|
yading@10
|
4 *
|
yading@10
|
5 * This file is part of FFmpeg.
|
yading@10
|
6 *
|
yading@10
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
9 * License as published by the Free Software Foundation; either
|
yading@10
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
11 *
|
yading@10
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
15 * Lesser General Public License for more details.
|
yading@10
|
16 *
|
yading@10
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
20 */
|
yading@10
|
21
|
yading@10
|
22 #include "dshow_capture.h"
|
yading@10
|
23
|
yading@10
|
24 long ff_copy_dshow_media_type(AM_MEDIA_TYPE *dst, const AM_MEDIA_TYPE *src)
|
yading@10
|
25 {
|
yading@10
|
26 uint8_t *pbFormat = NULL;
|
yading@10
|
27
|
yading@10
|
28 if (src->cbFormat) {
|
yading@10
|
29 pbFormat = CoTaskMemAlloc(src->cbFormat);
|
yading@10
|
30 if (!pbFormat)
|
yading@10
|
31 return E_OUTOFMEMORY;
|
yading@10
|
32 memcpy(pbFormat, src->pbFormat, src->cbFormat);
|
yading@10
|
33 }
|
yading@10
|
34
|
yading@10
|
35 *dst = *src;
|
yading@10
|
36 dst->pUnk = NULL;
|
yading@10
|
37 dst->pbFormat = pbFormat;
|
yading@10
|
38
|
yading@10
|
39 return S_OK;
|
yading@10
|
40 }
|
yading@10
|
41
|
yading@10
|
42 void ff_printGUID(const GUID *g)
|
yading@10
|
43 {
|
yading@10
|
44 #if DSHOWDEBUG
|
yading@10
|
45 const uint32_t *d = (const uint32_t *) &g->Data1;
|
yading@10
|
46 const uint16_t *w = (const uint16_t *) &g->Data2;
|
yading@10
|
47 const uint8_t *c = (const uint8_t *) &g->Data4;
|
yading@10
|
48
|
yading@10
|
49 dshowdebug("0x%08x 0x%04x 0x%04x %02x%02x%02x%02x%02x%02x%02x%02x",
|
yading@10
|
50 d[0], w[0], w[1],
|
yading@10
|
51 c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
|
yading@10
|
52 #endif
|
yading@10
|
53 }
|
yading@10
|
54
|
yading@10
|
55 static const char *dshow_context_to_name(void *ptr)
|
yading@10
|
56 {
|
yading@10
|
57 return "dshow";
|
yading@10
|
58 }
|
yading@10
|
59 static const AVClass ff_dshow_context_class = { "DirectShow", dshow_context_to_name };
|
yading@10
|
60 const AVClass *ff_dshow_context_class_ptr = &ff_dshow_context_class;
|
yading@10
|
61
|
yading@10
|
62 #define dstruct(pctx, sname, var, type) \
|
yading@10
|
63 dshowdebug(" "#var":\t%"type"\n", sname->var)
|
yading@10
|
64
|
yading@10
|
65 #if DSHOWDEBUG
|
yading@10
|
66 static void dump_bih(void *s, BITMAPINFOHEADER *bih)
|
yading@10
|
67 {
|
yading@10
|
68 dshowdebug(" BITMAPINFOHEADER\n");
|
yading@10
|
69 dstruct(s, bih, biSize, "lu");
|
yading@10
|
70 dstruct(s, bih, biWidth, "ld");
|
yading@10
|
71 dstruct(s, bih, biHeight, "ld");
|
yading@10
|
72 dstruct(s, bih, biPlanes, "d");
|
yading@10
|
73 dstruct(s, bih, biBitCount, "d");
|
yading@10
|
74 dstruct(s, bih, biCompression, "lu");
|
yading@10
|
75 dshowdebug(" biCompression:\t\"%.4s\"\n",
|
yading@10
|
76 (char*) &bih->biCompression);
|
yading@10
|
77 dstruct(s, bih, biSizeImage, "lu");
|
yading@10
|
78 dstruct(s, bih, biXPelsPerMeter, "lu");
|
yading@10
|
79 dstruct(s, bih, biYPelsPerMeter, "lu");
|
yading@10
|
80 dstruct(s, bih, biClrUsed, "lu");
|
yading@10
|
81 dstruct(s, bih, biClrImportant, "lu");
|
yading@10
|
82 }
|
yading@10
|
83 #endif
|
yading@10
|
84
|
yading@10
|
85 void ff_print_VIDEO_STREAM_CONFIG_CAPS(const VIDEO_STREAM_CONFIG_CAPS *caps)
|
yading@10
|
86 {
|
yading@10
|
87 #if DSHOWDEBUG
|
yading@10
|
88 dshowdebug(" VIDEO_STREAM_CONFIG_CAPS\n");
|
yading@10
|
89 dshowdebug(" guid\t");
|
yading@10
|
90 ff_printGUID(&caps->guid);
|
yading@10
|
91 dshowdebug("\n");
|
yading@10
|
92 dshowdebug(" VideoStandard\t%lu\n", caps->VideoStandard);
|
yading@10
|
93 dshowdebug(" InputSize %ld\t%ld\n", caps->InputSize.cx, caps->InputSize.cy);
|
yading@10
|
94 dshowdebug(" MinCroppingSize %ld\t%ld\n", caps->MinCroppingSize.cx, caps->MinCroppingSize.cy);
|
yading@10
|
95 dshowdebug(" MaxCroppingSize %ld\t%ld\n", caps->MaxCroppingSize.cx, caps->MaxCroppingSize.cy);
|
yading@10
|
96 dshowdebug(" CropGranularityX\t%d\n", caps->CropGranularityX);
|
yading@10
|
97 dshowdebug(" CropGranularityY\t%d\n", caps->CropGranularityY);
|
yading@10
|
98 dshowdebug(" CropAlignX\t%d\n", caps->CropAlignX);
|
yading@10
|
99 dshowdebug(" CropAlignY\t%d\n", caps->CropAlignY);
|
yading@10
|
100 dshowdebug(" MinOutputSize %ld\t%ld\n", caps->MinOutputSize.cx, caps->MinOutputSize.cy);
|
yading@10
|
101 dshowdebug(" MaxOutputSize %ld\t%ld\n", caps->MaxOutputSize.cx, caps->MaxOutputSize.cy);
|
yading@10
|
102 dshowdebug(" OutputGranularityX\t%d\n", caps->OutputGranularityX);
|
yading@10
|
103 dshowdebug(" OutputGranularityY\t%d\n", caps->OutputGranularityY);
|
yading@10
|
104 dshowdebug(" StretchTapsX\t%d\n", caps->StretchTapsX);
|
yading@10
|
105 dshowdebug(" StretchTapsY\t%d\n", caps->StretchTapsY);
|
yading@10
|
106 dshowdebug(" ShrinkTapsX\t%d\n", caps->ShrinkTapsX);
|
yading@10
|
107 dshowdebug(" ShrinkTapsY\t%d\n", caps->ShrinkTapsY);
|
yading@10
|
108 dshowdebug(" MinFrameInterval\t%"PRId64"\n", caps->MinFrameInterval);
|
yading@10
|
109 dshowdebug(" MaxFrameInterval\t%"PRId64"\n", caps->MaxFrameInterval);
|
yading@10
|
110 dshowdebug(" MinBitsPerSecond\t%ld\n", caps->MinBitsPerSecond);
|
yading@10
|
111 dshowdebug(" MaxBitsPerSecond\t%ld\n", caps->MaxBitsPerSecond);
|
yading@10
|
112 #endif
|
yading@10
|
113 }
|
yading@10
|
114
|
yading@10
|
115 void ff_print_AUDIO_STREAM_CONFIG_CAPS(const AUDIO_STREAM_CONFIG_CAPS *caps)
|
yading@10
|
116 {
|
yading@10
|
117 #if DSHOWDEBUG
|
yading@10
|
118 dshowdebug(" AUDIO_STREAM_CONFIG_CAPS\n");
|
yading@10
|
119 dshowdebug(" guid\t");
|
yading@10
|
120 ff_printGUID(&caps->guid);
|
yading@10
|
121 dshowdebug("\n");
|
yading@10
|
122 dshowdebug(" MinimumChannels\t%lu\n", caps->MinimumChannels);
|
yading@10
|
123 dshowdebug(" MaximumChannels\t%lu\n", caps->MaximumChannels);
|
yading@10
|
124 dshowdebug(" ChannelsGranularity\t%lu\n", caps->ChannelsGranularity);
|
yading@10
|
125 dshowdebug(" MinimumBitsPerSample\t%lu\n", caps->MinimumBitsPerSample);
|
yading@10
|
126 dshowdebug(" MaximumBitsPerSample\t%lu\n", caps->MaximumBitsPerSample);
|
yading@10
|
127 dshowdebug(" BitsPerSampleGranularity\t%lu\n", caps->BitsPerSampleGranularity);
|
yading@10
|
128 dshowdebug(" MinimumSampleFrequency\t%lu\n", caps->MinimumSampleFrequency);
|
yading@10
|
129 dshowdebug(" MaximumSampleFrequency\t%lu\n", caps->MaximumSampleFrequency);
|
yading@10
|
130 dshowdebug(" SampleFrequencyGranularity\t%lu\n", caps->SampleFrequencyGranularity);
|
yading@10
|
131 #endif
|
yading@10
|
132 }
|
yading@10
|
133
|
yading@10
|
134 void ff_print_AM_MEDIA_TYPE(const AM_MEDIA_TYPE *type)
|
yading@10
|
135 {
|
yading@10
|
136 #if DSHOWDEBUG
|
yading@10
|
137 dshowdebug(" majortype\t");
|
yading@10
|
138 ff_printGUID(&type->majortype);
|
yading@10
|
139 dshowdebug("\n");
|
yading@10
|
140 dshowdebug(" subtype\t");
|
yading@10
|
141 ff_printGUID(&type->subtype);
|
yading@10
|
142 dshowdebug("\n");
|
yading@10
|
143 dshowdebug(" bFixedSizeSamples\t%d\n", type->bFixedSizeSamples);
|
yading@10
|
144 dshowdebug(" bTemporalCompression\t%d\n", type->bTemporalCompression);
|
yading@10
|
145 dshowdebug(" lSampleSize\t%lu\n", type->lSampleSize);
|
yading@10
|
146 dshowdebug(" formattype\t");
|
yading@10
|
147 ff_printGUID(&type->formattype);
|
yading@10
|
148 dshowdebug("\n");
|
yading@10
|
149 dshowdebug(" pUnk\t%p\n", type->pUnk);
|
yading@10
|
150 dshowdebug(" cbFormat\t%lu\n", type->cbFormat);
|
yading@10
|
151 dshowdebug(" pbFormat\t%p\n", type->pbFormat);
|
yading@10
|
152
|
yading@10
|
153 if (IsEqualGUID(&type->formattype, &FORMAT_VideoInfo)) {
|
yading@10
|
154 VIDEOINFOHEADER *v = (void *) type->pbFormat;
|
yading@10
|
155 dshowdebug(" rcSource: left %ld top %ld right %ld bottom %ld\n",
|
yading@10
|
156 v->rcSource.left, v->rcSource.top, v->rcSource.right, v->rcSource.bottom);
|
yading@10
|
157 dshowdebug(" rcTarget: left %ld top %ld right %ld bottom %ld\n",
|
yading@10
|
158 v->rcTarget.left, v->rcTarget.top, v->rcTarget.right, v->rcTarget.bottom);
|
yading@10
|
159 dshowdebug(" dwBitRate: %lu\n", v->dwBitRate);
|
yading@10
|
160 dshowdebug(" dwBitErrorRate: %lu\n", v->dwBitErrorRate);
|
yading@10
|
161 dshowdebug(" AvgTimePerFrame: %"PRId64"\n", v->AvgTimePerFrame);
|
yading@10
|
162 dump_bih(NULL, &v->bmiHeader);
|
yading@10
|
163 } else if (IsEqualGUID(&type->formattype, &FORMAT_VideoInfo2)) {
|
yading@10
|
164 VIDEOINFOHEADER2 *v = (void *) type->pbFormat;
|
yading@10
|
165 dshowdebug(" rcSource: left %ld top %ld right %ld bottom %ld\n",
|
yading@10
|
166 v->rcSource.left, v->rcSource.top, v->rcSource.right, v->rcSource.bottom);
|
yading@10
|
167 dshowdebug(" rcTarget: left %ld top %ld right %ld bottom %ld\n",
|
yading@10
|
168 v->rcTarget.left, v->rcTarget.top, v->rcTarget.right, v->rcTarget.bottom);
|
yading@10
|
169 dshowdebug(" dwBitRate: %lu\n", v->dwBitRate);
|
yading@10
|
170 dshowdebug(" dwBitErrorRate: %lu\n", v->dwBitErrorRate);
|
yading@10
|
171 dshowdebug(" AvgTimePerFrame: %"PRId64"\n", v->AvgTimePerFrame);
|
yading@10
|
172 dshowdebug(" dwInterlaceFlags: %lu\n", v->dwInterlaceFlags);
|
yading@10
|
173 dshowdebug(" dwCopyProtectFlags: %lu\n", v->dwCopyProtectFlags);
|
yading@10
|
174 dshowdebug(" dwPictAspectRatioX: %lu\n", v->dwPictAspectRatioX);
|
yading@10
|
175 dshowdebug(" dwPictAspectRatioY: %lu\n", v->dwPictAspectRatioY);
|
yading@10
|
176 // dshowdebug(" dwReserved1: %lu\n", v->u.dwReserved1); /* mingw-w64 is buggy and doesn't name unnamed unions */
|
yading@10
|
177 dshowdebug(" dwReserved2: %lu\n", v->dwReserved2);
|
yading@10
|
178 dump_bih(NULL, &v->bmiHeader);
|
yading@10
|
179 } else if (IsEqualGUID(&type->formattype, &FORMAT_WaveFormatEx)) {
|
yading@10
|
180 WAVEFORMATEX *fx = (void *) type->pbFormat;
|
yading@10
|
181 dshowdebug(" wFormatTag: %u\n", fx->wFormatTag);
|
yading@10
|
182 dshowdebug(" nChannels: %u\n", fx->nChannels);
|
yading@10
|
183 dshowdebug(" nSamplesPerSec: %lu\n", fx->nSamplesPerSec);
|
yading@10
|
184 dshowdebug(" nAvgBytesPerSec: %lu\n", fx->nAvgBytesPerSec);
|
yading@10
|
185 dshowdebug(" nBlockAlign: %u\n", fx->nBlockAlign);
|
yading@10
|
186 dshowdebug(" wBitsPerSample: %u\n", fx->wBitsPerSample);
|
yading@10
|
187 dshowdebug(" cbSize: %u\n", fx->cbSize);
|
yading@10
|
188 }
|
yading@10
|
189 #endif
|
yading@10
|
190 }
|