質問編集履歴

2

追記

2019/05/29 09:47

投稿

kokawa2003
kokawa2003

スコア217

test CHANGED
File without changes
test CHANGED
@@ -439,3 +439,199 @@
439
439
  の根拠がわからない。
440
440
 
441
441
  掛ける係数は正確にこれなんだろうか?
442
+
443
+
444
+
445
+ ソース(全面的に無駄コードカット)
446
+
447
+ ```cpp
448
+
449
+ MyTransformFilter::MyTransformFilter():CTransformFilter(NAME("My Transform Filter"), 0,CLSID_MyTransformFilter) {
450
+
451
+
452
+
453
+ }
454
+
455
+
456
+
457
+
458
+
459
+ HRESULT MyTransformFilter::CheckInputType(const CMediaType* mtIn) {
460
+
461
+ VIDEOINFOHEADER* pVih =
462
+
463
+ reinterpret_cast<VIDEOINFOHEADER*>(mtIn->pbFormat);
464
+
465
+
466
+
467
+ if (*mtIn->Type() != MEDIATYPE_Video ||
468
+
469
+ *mtIn->Subtype() != MEDIASUBTYPE_RGB32 ||
470
+
471
+ *mtIn->FormatType() != FORMAT_VideoInfo)
472
+
473
+ {
474
+
475
+ return VFW_E_TYPE_NOT_ACCEPTED;
476
+
477
+ }
478
+
479
+ return S_OK;
480
+
481
+ }
482
+
483
+ HRESULT MyTransformFilter::GetMediaType(int iPosition, CMediaType* pMediaType) {
484
+
485
+ if (iPosition < 0) {
486
+
487
+ return E_INVALIDARG;
488
+
489
+ }
490
+
491
+ else if (iPosition > 0) {
492
+
493
+ return VFW_S_NO_MORE_ITEMS;
494
+
495
+ }
496
+
497
+ // 優先出力タイプは 入力メディアタイプと同じとする
498
+
499
+ // ※ データフォーマットを変換するフィルタ(encoder,decoderなど) は異なるメディアタイプになる.
500
+
501
+ *pMediaType = m_pInput->CurrentMediaType();
502
+
503
+ return S_OK;
504
+
505
+ }
506
+
507
+ HRESULT MyTransformFilter::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut) {
508
+
509
+ if (*mtIn->Type() != MEDIATYPE_Video ||
510
+
511
+ *mtIn->Subtype() != MEDIASUBTYPE_RGB32 ||
512
+
513
+ *mtIn->FormatType() != FORMAT_VideoInfo)
514
+
515
+ {
516
+
517
+ return VFW_E_TYPE_NOT_ACCEPTED;
518
+
519
+ }
520
+
521
+ if (*mtIn != *mtOut) {
522
+
523
+ return VFW_E_TYPE_NOT_ACCEPTED;
524
+
525
+ }
526
+
527
+ return S_OK;
528
+
529
+ }
530
+
531
+ HRESULT MyTransformFilter::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* ppropInputRequest) {
532
+
533
+ if (m_pInput != NULL && m_pInput->IsConnected() == FALSE) {
534
+
535
+ return E_FAIL;
536
+
537
+ }
538
+
539
+ // バッファサイズを取得し、アロケータプロパティに設定
540
+
541
+ ppropInputRequest->cBuffers = 1;
542
+
543
+ ppropInputRequest->cbBuffer = this->m_pInput->CurrentMediaType().GetSampleSize();
544
+
545
+ if (ppropInputRequest->cbBuffer == 0) {
546
+
547
+ AM_MEDIA_TYPE* pType = &m_pInput->CurrentMediaType();
548
+
549
+ VIDEOINFOHEADER* pvi = (VIDEOINFOHEADER*)pType->pbFormat;
550
+
551
+ ASSERT(pvi);
552
+
553
+ int cxImage = pvi->bmiHeader.biWidth;
554
+
555
+ int cyImage = pvi->bmiHeader.biHeight;
556
+
557
+ ppropInputRequest->cbBuffer = cxImage * cyImage * 2 * 10;
558
+
559
+
560
+
561
+ }
562
+
563
+ ASSERT(ppropInputRequest->cbBuffer);
564
+
565
+ ALLOCATOR_PROPERTIES actual_prop;
566
+
567
+ HRESULT hr = pAlloc->SetProperties(ppropInputRequest, &actual_prop);
568
+
569
+ if (FAILED(hr)) {
570
+
571
+ return hr;
572
+
573
+ }
574
+
575
+ // アロケータは要求に対して正確に一致できるとは限らないため、確保されたかチェックする
576
+
577
+ if (ppropInputRequest->cBuffers > actual_prop.cBuffers ||
578
+
579
+ ppropInputRequest->cbBuffer > actual_prop.cbBuffer)
580
+
581
+ {
582
+
583
+ return E_FAIL;
584
+
585
+ }
586
+
587
+ return S_OK;
588
+
589
+ }
590
+
591
+ HRESULT MyTransformFilter::Transform(IMediaSample* pIn, IMediaSample* pOut) {
592
+
593
+ LPDWORD pSrc, pDest;
594
+
595
+ pIn->GetPointer((BYTE * *)& pSrc);
596
+
597
+ pOut->GetPointer((BYTE * *)& pDest);
598
+
599
+ const long act_size = pIn->GetActualDataLength();
600
+
601
+
602
+
603
+
604
+
605
+ memcpy(pDest, pSrc, act_size);
606
+
607
+ pOut->SetActualDataLength(act_size);
608
+
609
+ pOut->SetSyncPoint(TRUE);
610
+
611
+
612
+
613
+ OutputDebugString(L"transe\n");
614
+
615
+
616
+
617
+ /*
618
+
619
+ LONGLONG media_start, media_end;
620
+
621
+ pIn->GetMediaTime(&media_start, &media_end);
622
+
623
+ pOut->SetMediaTime(&media_start, &media_end);
624
+
625
+ REFERENCE_TIME ref_start, ref_end;
626
+
627
+ pIn->GetTime(&ref_start, &ref_end);
628
+
629
+ pOut->SetTime(&ref_start, &ref_end);
630
+
631
+ pOut->SetSyncPoint(TRUE);*/
632
+
633
+ return S_OK;
634
+
635
+ }
636
+
637
+ ```

1

追記

2019/05/29 09:47

投稿

kokawa2003
kokawa2003

スコア217

test CHANGED
File without changes
test CHANGED
@@ -380,7 +380,9 @@
380
380
 
381
381
  これでテレビ(地デジ)画像をフィルターしようとして
382
382
 
383
- 動いているGRAPHのEnhancedVideoRenderの直前にこのフィルターを入れてみました。
383
+ 動いているGRAPHのEnhancedVideoRenderの直前にこのフィルターを入れてみま
384
+
385
+ した。
384
386
 
385
387
  幸いtransformが呼ばれているのは見ましたが実際の画像は緑がかったものでした。
386
388
 
@@ -403,3 +405,37 @@
403
405
  お教えいただければ幸いです。
404
406
 
405
407
  あと私が知っているのは、CheckInputTypeにSYSTEMがNV12,YV12,IYUV,RGB555,RGB8でもアクセスしてきているのは知っていますがこれらにやはりまじめに対応すべきか?とは考えています。でもどう対応するのかは全く分かりません
408
+
409
+
410
+
411
+ 追記
412
+
413
+ https://groups.google.com/forum/#!topic/microsoft.public.win32.programmer.directx.video/EltvHpBjsQY
414
+
415
+ とかまじめに読んでいるとバッファの長さがまずい?とおもった。
416
+
417
+ んでとりあえず
418
+
419
+ DecideBufferSize
420
+
421
+
422
+
423
+ AM_MEDIA_TYPE* pType = &m_pInput->CurrentMediaType();
424
+
425
+ VIDEOINFOHEADER* pvi = (VIDEOINFOHEADER*)pType->pbFormat;
426
+
427
+ ASSERT(pvi);
428
+
429
+ int cxImage = pvi->bmiHeader.biWidth;
430
+
431
+ int cyImage = pvi->bmiHeader.biHeight;
432
+
433
+ pProperties->cbBuffer = cxImage * cyImage * 2 * 10;
434
+
435
+ を追加したらよさげなのだが
436
+
437
+ cxImage * cyImage * 2 * 10;
438
+
439
+ の根拠がわからない。
440
+
441
+ 掛ける係数は正確にこれなんだろうか?