質問編集履歴
2
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -218,4 +218,102 @@
|
|
218
218
|
を追加したらよさげなのだが
|
219
219
|
cxImage * cyImage * 2 * 10;
|
220
220
|
の根拠がわからない。
|
221
|
-
掛ける係数は正確にこれなんだろうか?
|
221
|
+
掛ける係数は正確にこれなんだろうか?
|
222
|
+
|
223
|
+
ソース(全面的に無駄コードカット)
|
224
|
+
```cpp
|
225
|
+
MyTransformFilter::MyTransformFilter():CTransformFilter(NAME("My Transform Filter"), 0,CLSID_MyTransformFilter) {
|
226
|
+
|
227
|
+
}
|
228
|
+
|
229
|
+
|
230
|
+
HRESULT MyTransformFilter::CheckInputType(const CMediaType* mtIn) {
|
231
|
+
VIDEOINFOHEADER* pVih =
|
232
|
+
reinterpret_cast<VIDEOINFOHEADER*>(mtIn->pbFormat);
|
233
|
+
|
234
|
+
if (*mtIn->Type() != MEDIATYPE_Video ||
|
235
|
+
*mtIn->Subtype() != MEDIASUBTYPE_RGB32 ||
|
236
|
+
*mtIn->FormatType() != FORMAT_VideoInfo)
|
237
|
+
{
|
238
|
+
return VFW_E_TYPE_NOT_ACCEPTED;
|
239
|
+
}
|
240
|
+
return S_OK;
|
241
|
+
}
|
242
|
+
HRESULT MyTransformFilter::GetMediaType(int iPosition, CMediaType* pMediaType) {
|
243
|
+
if (iPosition < 0) {
|
244
|
+
return E_INVALIDARG;
|
245
|
+
}
|
246
|
+
else if (iPosition > 0) {
|
247
|
+
return VFW_S_NO_MORE_ITEMS;
|
248
|
+
}
|
249
|
+
// 優先出力タイプは 入力メディアタイプと同じとする
|
250
|
+
// ※ データフォーマットを変換するフィルタ(encoder,decoderなど) は異なるメディアタイプになる.
|
251
|
+
*pMediaType = m_pInput->CurrentMediaType();
|
252
|
+
return S_OK;
|
253
|
+
}
|
254
|
+
HRESULT MyTransformFilter::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut) {
|
255
|
+
if (*mtIn->Type() != MEDIATYPE_Video ||
|
256
|
+
*mtIn->Subtype() != MEDIASUBTYPE_RGB32 ||
|
257
|
+
*mtIn->FormatType() != FORMAT_VideoInfo)
|
258
|
+
{
|
259
|
+
return VFW_E_TYPE_NOT_ACCEPTED;
|
260
|
+
}
|
261
|
+
if (*mtIn != *mtOut) {
|
262
|
+
return VFW_E_TYPE_NOT_ACCEPTED;
|
263
|
+
}
|
264
|
+
return S_OK;
|
265
|
+
}
|
266
|
+
HRESULT MyTransformFilter::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* ppropInputRequest) {
|
267
|
+
if (m_pInput != NULL && m_pInput->IsConnected() == FALSE) {
|
268
|
+
return E_FAIL;
|
269
|
+
}
|
270
|
+
// バッファサイズを取得し、アロケータプロパティに設定
|
271
|
+
ppropInputRequest->cBuffers = 1;
|
272
|
+
ppropInputRequest->cbBuffer = this->m_pInput->CurrentMediaType().GetSampleSize();
|
273
|
+
if (ppropInputRequest->cbBuffer == 0) {
|
274
|
+
AM_MEDIA_TYPE* pType = &m_pInput->CurrentMediaType();
|
275
|
+
VIDEOINFOHEADER* pvi = (VIDEOINFOHEADER*)pType->pbFormat;
|
276
|
+
ASSERT(pvi);
|
277
|
+
int cxImage = pvi->bmiHeader.biWidth;
|
278
|
+
int cyImage = pvi->bmiHeader.biHeight;
|
279
|
+
ppropInputRequest->cbBuffer = cxImage * cyImage * 2 * 10;
|
280
|
+
|
281
|
+
}
|
282
|
+
ASSERT(ppropInputRequest->cbBuffer);
|
283
|
+
ALLOCATOR_PROPERTIES actual_prop;
|
284
|
+
HRESULT hr = pAlloc->SetProperties(ppropInputRequest, &actual_prop);
|
285
|
+
if (FAILED(hr)) {
|
286
|
+
return hr;
|
287
|
+
}
|
288
|
+
// アロケータは要求に対して正確に一致できるとは限らないため、確保されたかチェックする
|
289
|
+
if (ppropInputRequest->cBuffers > actual_prop.cBuffers ||
|
290
|
+
ppropInputRequest->cbBuffer > actual_prop.cbBuffer)
|
291
|
+
{
|
292
|
+
return E_FAIL;
|
293
|
+
}
|
294
|
+
return S_OK;
|
295
|
+
}
|
296
|
+
HRESULT MyTransformFilter::Transform(IMediaSample* pIn, IMediaSample* pOut) {
|
297
|
+
LPDWORD pSrc, pDest;
|
298
|
+
pIn->GetPointer((BYTE * *)& pSrc);
|
299
|
+
pOut->GetPointer((BYTE * *)& pDest);
|
300
|
+
const long act_size = pIn->GetActualDataLength();
|
301
|
+
|
302
|
+
|
303
|
+
memcpy(pDest, pSrc, act_size);
|
304
|
+
pOut->SetActualDataLength(act_size);
|
305
|
+
pOut->SetSyncPoint(TRUE);
|
306
|
+
|
307
|
+
OutputDebugString(L"transe\n");
|
308
|
+
|
309
|
+
/*
|
310
|
+
LONGLONG media_start, media_end;
|
311
|
+
pIn->GetMediaTime(&media_start, &media_end);
|
312
|
+
pOut->SetMediaTime(&media_start, &media_end);
|
313
|
+
REFERENCE_TIME ref_start, ref_end;
|
314
|
+
pIn->GetTime(&ref_start, &ref_end);
|
315
|
+
pOut->SetTime(&ref_start, &ref_end);
|
316
|
+
pOut->SetSyncPoint(TRUE);*/
|
317
|
+
return S_OK;
|
318
|
+
}
|
319
|
+
```
|
1
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -189,7 +189,8 @@
|
|
189
189
|
```
|
190
190
|
|
191
191
|
これでテレビ(地デジ)画像をフィルターしようとして
|
192
|
-
動いているGRAPHのEnhancedVideoRenderの直前にこのフィルターを入れてみま
|
192
|
+
動いているGRAPHのEnhancedVideoRenderの直前にこのフィルターを入れてみま
|
193
|
+
した。
|
193
194
|
幸いtransformが呼ばれているのは見ましたが実際の画像は緑がかったものでした。
|
194
195
|

|
195
196
|
これYUV関係か?と思ったのでこのフィルターの後にCOLOR space converterをいれてみましたが状況は変わりませんでした。
|
@@ -200,4 +201,21 @@
|
|
200
201
|
でS_OKがかえってきているのは見ました。
|
201
202
|
なのに何故この画像がでるのか仕組みが全く分かりません。
|
202
203
|
お教えいただければ幸いです。
|
203
|
-
あと私が知っているのは、CheckInputTypeにSYSTEMがNV12,YV12,IYUV,RGB555,RGB8でもアクセスしてきているのは知っていますがこれらにやはりまじめに対応すべきか?とは考えています。でもどう対応するのかは全く分かりません
|
204
|
+
あと私が知っているのは、CheckInputTypeにSYSTEMがNV12,YV12,IYUV,RGB555,RGB8でもアクセスしてきているのは知っていますがこれらにやはりまじめに対応すべきか?とは考えています。でもどう対応するのかは全く分かりません
|
205
|
+
|
206
|
+
追記
|
207
|
+
https://groups.google.com/forum/#!topic/microsoft.public.win32.programmer.directx.video/EltvHpBjsQY
|
208
|
+
とかまじめに読んでいるとバッファの長さがまずい?とおもった。
|
209
|
+
んでとりあえず
|
210
|
+
DecideBufferSize
|
211
|
+
に
|
212
|
+
AM_MEDIA_TYPE* pType = &m_pInput->CurrentMediaType();
|
213
|
+
VIDEOINFOHEADER* pvi = (VIDEOINFOHEADER*)pType->pbFormat;
|
214
|
+
ASSERT(pvi);
|
215
|
+
int cxImage = pvi->bmiHeader.biWidth;
|
216
|
+
int cyImage = pvi->bmiHeader.biHeight;
|
217
|
+
pProperties->cbBuffer = cxImage * cyImage * 2 * 10;
|
218
|
+
を追加したらよさげなのだが
|
219
|
+
cxImage * cyImage * 2 * 10;
|
220
|
+
の根拠がわからない。
|
221
|
+
掛ける係数は正確にこれなんだろうか?
|