teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

追記

2019/05/29 09:47

投稿

kokawa2003
kokawa2003

スコア217

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

追記

2019/05/29 09:47

投稿

kokawa2003
kokawa2003

スコア217

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
  ![イメージ説明](2fbd47f071245c1b9e2a4d5fd84d68d5.png)
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
+ 掛ける係数は正確にこれなんだろうか?