annotate ffmpeg/libavdevice/dshow_common.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
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 }