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(libAVEnumPins, yading@10: { {&IID_IUnknown,0}, {&IID_IEnumPins,0} }) yading@10: DECLARE_ADDREF(libAVEnumPins) yading@10: DECLARE_RELEASE(libAVEnumPins) yading@10: yading@10: long WINAPI yading@10: libAVEnumPins_Next(libAVEnumPins *this, unsigned long n, IPin **pins, yading@10: unsigned long *fetched) yading@10: { yading@10: int count = 0; yading@10: dshowdebug("libAVEnumPins_Next(%p)\n", this); yading@10: if (!pins) yading@10: return E_POINTER; yading@10: if (!this->pos && n == 1) { yading@10: libAVPin_AddRef(this->pin); yading@10: *pins = (IPin *) this->pin; yading@10: count = 1; 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: libAVEnumPins_Skip(libAVEnumPins *this, unsigned long n) yading@10: { yading@10: dshowdebug("libAVEnumPins_Skip(%p)\n", this); yading@10: if (n) /* Any skip will always fall outside of the only valid pin. */ yading@10: return S_FALSE; yading@10: return S_OK; yading@10: } yading@10: long WINAPI yading@10: libAVEnumPins_Reset(libAVEnumPins *this) yading@10: { yading@10: dshowdebug("libAVEnumPins_Reset(%p)\n", this); yading@10: this->pos = 0; yading@10: return S_OK; yading@10: } yading@10: long WINAPI yading@10: libAVEnumPins_Clone(libAVEnumPins *this, libAVEnumPins **pins) yading@10: { yading@10: libAVEnumPins *new; yading@10: dshowdebug("libAVEnumPins_Clone(%p)\n", this); yading@10: if (!pins) yading@10: return E_POINTER; yading@10: new = libAVEnumPins_Create(this->pin, this->filter); yading@10: if (!new) yading@10: return E_OUTOFMEMORY; yading@10: new->pos = this->pos; yading@10: *pins = new; yading@10: return S_OK; yading@10: } yading@10: yading@10: static int yading@10: libAVEnumPins_Setup(libAVEnumPins *this, libAVPin *pin, libAVFilter *filter) yading@10: { yading@10: IEnumPinsVtbl *vtbl = this->vtbl; yading@10: SETVTBL(vtbl, libAVEnumPins, QueryInterface); yading@10: SETVTBL(vtbl, libAVEnumPins, AddRef); yading@10: SETVTBL(vtbl, libAVEnumPins, Release); yading@10: SETVTBL(vtbl, libAVEnumPins, Next); yading@10: SETVTBL(vtbl, libAVEnumPins, Skip); yading@10: SETVTBL(vtbl, libAVEnumPins, Reset); yading@10: SETVTBL(vtbl, libAVEnumPins, Clone); yading@10: yading@10: this->pin = pin; yading@10: this->filter = filter; yading@10: libAVFilter_AddRef(this->filter); yading@10: yading@10: return 1; yading@10: } yading@10: static int yading@10: libAVEnumPins_Cleanup(libAVEnumPins *this) yading@10: { yading@10: libAVFilter_Release(this->filter); yading@10: return 1; yading@10: } yading@10: DECLARE_CREATE(libAVEnumPins, libAVEnumPins_Setup(this, pin, filter), yading@10: libAVPin *pin, libAVFilter *filter) yading@10: DECLARE_DESTROY(libAVEnumPins, libAVEnumPins_Cleanup)