2015-03-23 4 views
0

Как я могу изменить rcTarget в filter?Directshow, формат смены фильтра

Source and Target Rectangles in Video Renderers

Я хочу, пример в свободном паскаль и DSpack. Мой проект должен работать с форматом видео 720x576. Если я смогу изменить фильтр rcTarget, например: LAVSplitter pin VIDEO, я решил свои проблемы.


Я хочу, чтобы объяснить мою проблему:

Мой проект и разработан с DSPack и Лазаре. Мне нужно запустить плейлист в медиафайле и добавить прокрутку текста. Выходная плата DeckLink аналоговая или аналогичная. Для подключения монитора ТВ-сигнала S-Video.

Теперь я вижу на настольных компьютерах и мониторах видео, подключенных к DeckLink, только оригинальные видеоролики 720x576.

Я хочу, чтобы все видеоформаты работали. msdn site: Source and Target Rectangles in Video Renderers описывает, как изменить rcTarget в videoinfoheader. Я не знаю, как писать в pascal, используется dspack. или есть другой способ изменить размер видео? Мне нужно создать новый фильтр, или я могу изменить свойства в примере фильтра rcTarget: LAVSplitter?

мой график | SourceFile | -> 1920x1080 | Разделитель LAV | -> 720x576 | Декодер LAV | -> Тройник | -> видеоокна и рендеринг DeckLink

В Интернете много примеров для изменения размера веб-камеры захвата внешних устройств, . Я не могу найти код вывода внешнего устройства. Для этого я прошу о помощи.

У меня есть пример для MPEG-2, не работает. Где я ошибаюсь?

// var 
// mt  : AM_Media_Type; 
// seqHdr : array [0..0] of byte; //this is right? 
// pWIH : MPEG2VIDEOINFO; 
ZeroMemory(@Mt, sizeof(AM_MEDIA_TYPE)); 
Mt.MajorType := MEDIATYPE_Video; 
Mt.SubType := MEDIASUBTYPE_RGB32; 
Mt.FormatType := FORMAT_MPEG2_VIDEO; 

Mt.cbFormat := sizeof(MPEG2VIDEOINFO) + sizeof(seqHdr); 
mt.pbFormat := CoTaskMemAlloc(mt.cbFormat); 

if (mt.pbFormat = NULL) then exit; // ERROR 
ZeroMemory(mt.pbFormat, mt.cbFormat); 

{ RCSRC.Left := 0; 
RCSRC.Top:= 0; 
RCSRC.Right := 0; 
RCSRC.Bottom := 0; 
} 
pWIH.hdr.rcSource.Left:=0;  
pWIH.hdr.rcSource.Top:=0; 
pWIH.hdr.rcSource.Right:=0; 
pWIH.hdr.rcSource.Bottom:=0; 
// pWIH.hdr.rcSource := RCSRC; 
// pWIH.hdr.rcTarget := Rect(0,0,720,576); 
pWIH.hdr.rcTarget.Left:=0; 
pWIH.hdr.rcTarget.Top:=0; 
pWIH.hdr.rcTarget.Right:=576; 
pWIH.hdr.rcTarget.Bottom:=720; 
pWIH.hdr.AvgTimePerFrame := 278335; 
pWIH.hdr.dwPictAspectRatioX := 4; 
pWIH.hdr.dwPictAspectRatioY := 3; 
pWIH.hdr.bmiHeader.biSize := 40; 
pWIH.hdr.bmiHeader.biWidth := 720; 
pWIH.hdr.bmiHeader.biHeight := 576; 
pWIH.cbSequenceHeader := sizeof(seqHdr); 
CopyMemory(@pwih.dwSequenceHeader, @seqHdr, sizeof(seqhdr)); 
//------------------------------------- 
SourceFilter.FindPin('Output',PinOutSource); 
(VideoWindow1 as IBaseFilter).FindPin('Input',PIn_input); 
PinOutSource.Connect(PIn_input,@mt); 
+0

К сожалению, я не могу понять, чего вы пытаетесь достичь. Вы хотите изменить размеры видеокадров после выхода из LAV Video Decoder? –

+0

Да, я хочу изменить размер видео. Мне нужно создать тип медиа структуры (mt: AM_Media_Type;) и назначить mt в выводе. Возможно, в LAVSplitter или LAV Video Decoder или другом фильтре выше по течению от графика. Вы можете помочь построить это? возможно с этим? out_pin.ConnectionMediaType (mt) Как написать тип носителя? – carmeloconny

ответ

0

спасибо, большое спасибо, спасибо. Я хочу использовать (3. Используйте этот фильтр DMO Resizer). Я создал фильтр Resize, как ваш пример. ОК. Теперь я хочу использовать: (FResizerDMO as IMediaObject) .SetOutputType для изменения размера моего видео. У меня есть трудности, вы можете мне помочь?

на сайте alax.info:

  1. CoCreateInstance ЦСП, как DMO и добавить его в ДМО обертке фильтра
  2. Используйте IWMResizerProps :: SetFullCropRegion для инициализации DSP // Я не должен области растениеводства ?
  3. Подключение входного контакта
  4. Установить выходной тип с помощью IMediaObject :: SetOutputType
  5. IGraphBuilder :: ConnectDirect выходной контакт

Это выше, является правильным?

Я пишу это:

var pVIH :VIDEOINFOHEADER; mt :DMO_MEDIA_TYPE; 
ZeroMemory(@mt, sizeof(DMO_MEDIA_TYPE)); 
mt.majortype := MEDIATYPE_Video; 
mt.subtype := MEDIASUBTYPE_RGB32; 
mt.formattype := FORMAT_VideoInfo; 
// ** I can not translate this ** 
// VIDEOINFOHEADER * pVIH = (VIDEOINFOHEADER *)pmt->pbFormat; 
// pVIH := TVideoInfoHeader(mt.pbFormat^); ???? 
pVIH.bmiHeader.biWidth := 720; 
pVIH.bmiHeader.biHeight := 576; 
pVIH.bmiHeader.biXPelsPerMeter:=9; 
pVIH.bmiHeader.biYPelsPerMeter:=16; 
pVIH.bmiHeader.biSizeImage := 720 * 480 * 3; 
hr := (FResizerDMO as IMediaObject).SetOutputType(0,@mt,DMO_SET_TYPEF_CLEAR); 
    if hr <> S_OK then showmessage('error'); // I receive error 

правильно эту дорогу? Если это правильно, вы можете помочь, потому что он не работает.

+0

Вы переводите его правильно. Я использовал эту DMO только с моим собственным фильтром-оберткой, а не со стандартным, поэтому я не знаю, могу ли я помочь в этом. Каков код ошибки (hr), возвращаемый SetOutputType и ConnectDirect? –

+0

1) Я получаю в hr (DMO_E_TYPE_NOT_ACCEPTED). 2) Я понимаю, что мне нужно инициализировать: IWMResizerProps :: SetFullCropRegion для инициализации DSP, я не знаю, как это сделать, помогите. – carmeloconny

+0

Прежде всего вам нужно указать mt.lSampleSize - это то же, что размер растрового изображения. biSizeImage неверен. RGB32 - 4 байта на пиксель, и вы вычисляете с помощью 3. Вы также должны указать bmiHeader.biSize: = SizeOf (TBitmapInfoHeader) и сначала свести на нет весь pVIH с помощью FillChar (pVih ^, SizeOf (TVideoInfoHeader), 0); (после pVih: = TVideoInfoHeader (pbFormat ...)) –

Смежные вопросы