2 * Directshow capture interface
3 * Copyright (c) 2010 Ramiro Polla
5 * This file is part of FFmpeg.
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.
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.
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
22 #include "dshow_capture.h"
24 long ff_copy_dshow_media_type(AM_MEDIA_TYPE
*dst
, const AM_MEDIA_TYPE
*src
)
26 uint8_t *pbFormat
= NULL
;
29 pbFormat
= CoTaskMemAlloc(src
->cbFormat
);
32 memcpy(pbFormat
, src
->pbFormat
, src
->cbFormat
);
37 dst
->pbFormat
= pbFormat
;
42 void ff_printGUID(const GUID
*g
)
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
;
49 dshowdebug("0x%08x 0x%04x 0x%04x %02x%02x%02x%02x%02x%02x%02x%02x",
51 c
[0], c
[1], c
[2], c
[3], c
[4], c
[5], c
[6], c
[7]);
55 static const char *dshow_context_to_name(void *ptr
)
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
;
62 #define dstruct(pctx, sname, var, type) \
63 dshowdebug(" "#var":\t%"type"\n", sname->var)
66 static void dump_bih(void *s
, BITMAPINFOHEADER
*bih
)
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");
85 void ff_print_VIDEO_STREAM_CONFIG_CAPS(const VIDEO_STREAM_CONFIG_CAPS
*caps
)
88 dshowdebug(" VIDEO_STREAM_CONFIG_CAPS\n");
89 dshowdebug(" guid\t");
90 ff_printGUID(&caps
->guid
);
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
);
115 void ff_print_AUDIO_STREAM_CONFIG_CAPS(const AUDIO_STREAM_CONFIG_CAPS
*caps
)
118 dshowdebug(" AUDIO_STREAM_CONFIG_CAPS\n");
119 dshowdebug(" guid\t");
120 ff_printGUID(&caps
->guid
);
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
);
134 void ff_print_AM_MEDIA_TYPE(const AM_MEDIA_TYPE
*type
)
137 dshowdebug(" majortype\t");
138 ff_printGUID(&type
->majortype
);
140 dshowdebug(" subtype\t");
141 ff_printGUID(&type
->subtype
);
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
);
149 dshowdebug(" pUnk\t%p\n", type
->pUnk
);
150 dshowdebug(" cbFormat\t%lu\n", type
->cbFormat
);
151 dshowdebug(" pbFormat\t%p\n", type
->pbFormat
);
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
);