yading@10: /* yading@10: * DirectShow capture interface yading@10: * Copyright (c) 2010 Ramiro Polla yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: #include "dshow_capture.h" yading@10: yading@10: DECLARE_QUERYINTERFACE(libAVEnumMediaTypes, yading@10: { {&IID_IUnknown,0}, {&IID_IEnumPins,0} }) yading@10: DECLARE_ADDREF(libAVEnumMediaTypes) yading@10: DECLARE_RELEASE(libAVEnumMediaTypes) yading@10: yading@10: long WINAPI yading@10: libAVEnumMediaTypes_Next(libAVEnumMediaTypes *this, unsigned long n, yading@10: AM_MEDIA_TYPE **types, unsigned long *fetched) yading@10: { yading@10: int count = 0; yading@10: dshowdebug("libAVEnumMediaTypes_Next(%p)\n", this); yading@10: if (!types) yading@10: return E_POINTER; yading@10: if (!this->pos && n == 1) { yading@10: if (!IsEqualGUID(&this->type.majortype, &GUID_NULL)) { yading@10: AM_MEDIA_TYPE *type = av_malloc(sizeof(AM_MEDIA_TYPE)); yading@10: ff_copy_dshow_media_type(type, &this->type); yading@10: *types = type; yading@10: count = 1; yading@10: } yading@10: this->pos = 1; yading@10: } yading@10: if (fetched) yading@10: *fetched = count; yading@10: if (!count) yading@10: return S_FALSE; yading@10: return S_OK; yading@10: } yading@10: long WINAPI yading@10: libAVEnumMediaTypes_Skip(libAVEnumMediaTypes *this, unsigned long n) yading@10: { yading@10: dshowdebug("libAVEnumMediaTypes_Skip(%p)\n", this); yading@10: if (n) /* Any skip will always fall outside of the only valid type. */ yading@10: return S_FALSE; yading@10: return S_OK; yading@10: } yading@10: long WINAPI yading@10: libAVEnumMediaTypes_Reset(libAVEnumMediaTypes *this) yading@10: { yading@10: dshowdebug("libAVEnumMediaTypes_Reset(%p)\n", this); yading@10: this->pos = 0; yading@10: return S_OK; yading@10: } yading@10: long WINAPI yading@10: libAVEnumMediaTypes_Clone(libAVEnumMediaTypes *this, libAVEnumMediaTypes **enums) yading@10: { yading@10: libAVEnumMediaTypes *new; yading@10: dshowdebug("libAVEnumMediaTypes_Clone(%p)\n", this); yading@10: if (!enums) yading@10: return E_POINTER; yading@10: new = libAVEnumMediaTypes_Create(&this->type); yading@10: if (!new) yading@10: return E_OUTOFMEMORY; yading@10: new->pos = this->pos; yading@10: *enums = new; yading@10: return S_OK; yading@10: } yading@10: yading@10: static int yading@10: libAVEnumMediaTypes_Setup(libAVEnumMediaTypes *this, const AM_MEDIA_TYPE *type) yading@10: { yading@10: IEnumPinsVtbl *vtbl = this->vtbl; yading@10: SETVTBL(vtbl, libAVEnumMediaTypes, QueryInterface); yading@10: SETVTBL(vtbl, libAVEnumMediaTypes, AddRef); yading@10: SETVTBL(vtbl, libAVEnumMediaTypes, Release); yading@10: SETVTBL(vtbl, libAVEnumMediaTypes, Next); yading@10: SETVTBL(vtbl, libAVEnumMediaTypes, Skip); yading@10: SETVTBL(vtbl, libAVEnumMediaTypes, Reset); yading@10: SETVTBL(vtbl, libAVEnumMediaTypes, Clone); yading@10: yading@10: if (!type) { yading@10: this->type.majortype = GUID_NULL; yading@10: } else { yading@10: ff_copy_dshow_media_type(&this->type, type); yading@10: } yading@10: yading@10: return 1; yading@10: } yading@10: DECLARE_CREATE(libAVEnumMediaTypes, libAVEnumMediaTypes_Setup(this, type), const AM_MEDIA_TYPE *type) yading@10: DECLARE_DESTROY(libAVEnumMediaTypes, nothing)