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 24DECLARE_QUERYINTERFACE(libAVEnumMediaTypes, 25 { {&IID_IUnknown,0}, {&IID_IEnumMediaTypes,0} }) 26DECLARE_ADDREF(libAVEnumMediaTypes) 27DECLARE_RELEASE(libAVEnumMediaTypes) 28 29long WINAPI 30libAVEnumMediaTypes_Next(libAVEnumMediaTypes *this, unsigned long n, 31 AM_MEDIA_TYPE **types, unsigned long *fetched) 32{ 33 int count = 0; 34 dshowdebug("libAVEnumMediaTypes_Next(%p)\n", this); 35 if (!types) 36 return E_POINTER; 37 if (!this->pos && n == 1) { 38 if (!IsEqualGUID(&this->type.majortype, &GUID_NULL)) { 39 AM_MEDIA_TYPE *type = av_malloc(sizeof(AM_MEDIA_TYPE)); 40 ff_copy_dshow_media_type(type, &this->type); 41 *types = type; 42 count = 1; 43 } 44 this->pos = 1; 45 } 46 if (fetched) 47 *fetched = count; 48 if (!count) 49 return S_FALSE; 50 return S_OK; 51} 52long WINAPI 53libAVEnumMediaTypes_Skip(libAVEnumMediaTypes *this, unsigned long n) 54{ 55 dshowdebug("libAVEnumMediaTypes_Skip(%p)\n", this); 56 if (n) /* Any skip will always fall outside of the only valid type. */ 57 return S_FALSE; 58 return S_OK; 59} 60long WINAPI 61libAVEnumMediaTypes_Reset(libAVEnumMediaTypes *this) 62{ 63 dshowdebug("libAVEnumMediaTypes_Reset(%p)\n", this); 64 this->pos = 0; 65 return S_OK; 66} 67long WINAPI 68libAVEnumMediaTypes_Clone(libAVEnumMediaTypes *this, libAVEnumMediaTypes **enums) 69{ 70 libAVEnumMediaTypes *new; 71 dshowdebug("libAVEnumMediaTypes_Clone(%p)\n", this); 72 if (!enums) 73 return E_POINTER; 74 new = libAVEnumMediaTypes_Create(&this->type); 75 if (!new) 76 return E_OUTOFMEMORY; 77 new->pos = this->pos; 78 *enums = new; 79 return S_OK; 80} 81 82static int 83libAVEnumMediaTypes_Setup(libAVEnumMediaTypes *this, const AM_MEDIA_TYPE *type) 84{ 85 IEnumMediaTypesVtbl *vtbl = this->vtbl; 86 SETVTBL(vtbl, libAVEnumMediaTypes, QueryInterface); 87 SETVTBL(vtbl, libAVEnumMediaTypes, AddRef); 88 SETVTBL(vtbl, libAVEnumMediaTypes, Release); 89 SETVTBL(vtbl, libAVEnumMediaTypes, Next); 90 SETVTBL(vtbl, libAVEnumMediaTypes, Skip); 91 SETVTBL(vtbl, libAVEnumMediaTypes, Reset); 92 SETVTBL(vtbl, libAVEnumMediaTypes, Clone); 93 94 if (!type) { 95 this->type.majortype = GUID_NULL; 96 } else { 97 ff_copy_dshow_media_type(&this->type, type); 98 } 99 100 return 1; 101} 102DECLARE_CREATE(libAVEnumMediaTypes, libAVEnumMediaTypes_Setup(this, type), const AM_MEDIA_TYPE *type) 103DECLARE_DESTROY(libAVEnumMediaTypes, nothing) 104