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