Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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. }
  191.