質問編集履歴
2
追記
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
追記
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
|
+
掛ける係数は正確にこれなんだろうか?
|