--- branches/dev-api-3/dshow/src/CXvidDecoder.cpp 2002/09/04 18:44:41 392 +++ branches/dev-api-3/dshow/src/CXvidDecoder.cpp 2002/11/07 10:34:14 632 @@ -290,6 +290,16 @@ /* get list of supported output colorspaces */ +#define ENABLE_IYUV +#define ENABLE_YV12 +#define ENABLE_YUY2 +#define ENABLE_UYVY +#define ENABLE_YVYU +#define ENABLE_RGB32 +#define ENABLE_RGB24 +#define ENABLE_RGB565 +#define ENABLE_RGB555 + HRESULT CXvidDecoder::GetMediaType(int iPosition, CMediaType *mtOut) { DEBUG("GetMediaType"); @@ -318,54 +328,78 @@ switch(iPosition) { - case 0 : + case 0 : +#ifdef ENABLE_IYUV + vih->bmiHeader.biCompression = MEDIASUBTYPE_IYUV.Data1; + vih->bmiHeader.biBitCount = 12; + mtOut->SetSubtype(&MEDIASUBTYPE_IYUV); + break; +#endif + + case 1: +#ifdef ENABLE_YV12 vih->bmiHeader.biCompression = MEDIASUBTYPE_YV12.Data1; vih->bmiHeader.biBitCount = 12; mtOut->SetSubtype(&MEDIASUBTYPE_YV12); break; +#endif - case 1: + case 2: +#ifdef ENABLE_YUY2 vih->bmiHeader.biCompression = MEDIASUBTYPE_YUY2.Data1; vih->bmiHeader.biBitCount = 16; mtOut->SetSubtype(&MEDIASUBTYPE_YUY2); break; +#endif - case 2: + case 3: +#ifdef ENABLE_YVYU vih->bmiHeader.biCompression = MEDIASUBTYPE_YVYU.Data1; vih->bmiHeader.biBitCount = 16; mtOut->SetSubtype(&MEDIASUBTYPE_YVYU); break; +#endif - case 3: + case 4: +#ifdef ENABLE_UYVY vih->bmiHeader.biCompression = MEDIASUBTYPE_UYVY.Data1; vih->bmiHeader.biBitCount = 16; mtOut->SetSubtype(&MEDIASUBTYPE_UYVY); break; +#endif - case 4: + case 5: +#ifdef ENABLE_RGB32 vih->bmiHeader.biCompression = BI_RGB; vih->bmiHeader.biBitCount = 32; mtOut->SetSubtype(&MEDIASUBTYPE_RGB32); break; +#endif - case 5: + case 6: +#ifdef ENABLE_RGB24 vih->bmiHeader.biCompression = BI_RGB; vih->bmiHeader.biBitCount = 24; mtOut->SetSubtype(&MEDIASUBTYPE_RGB24); break; +#endif - case 6: + case 7: +#ifdef ENABLE_RGB565 vih->bmiHeader.biCompression = BI_RGB; vih->bmiHeader.biBitCount = 16; - mtOut->SetSubtype(&MEDIASUBTYPE_RGB555); + mtOut->SetSubtype(&MEDIASUBTYPE_RGB565); break; +#endif - case 7: + case 8: +#ifdef ENABLE_RGB555 vih->bmiHeader.biCompression = BI_RGB; vih->bmiHeader.biBitCount = 16; - mtOut->SetSubtype(&MEDIASUBTYPE_RGB565); + mtOut->SetSubtype(&MEDIASUBTYPE_RGB555); break; - +#endif + default : return VFW_S_NO_MORE_ITEMS; } @@ -385,7 +419,35 @@ HRESULT CXvidDecoder::ChangeColorspace(GUID subtype, GUID formattype, void * format) { - if (subtype == MEDIASUBTYPE_YV12) + int rgb_flip; + + if (formattype == FORMAT_VideoInfo) + { + VIDEOINFOHEADER * vih = (VIDEOINFOHEADER * )format; + //m_frame.stride = vih->bmiHeader.biWidth; + // dev-api-3: + m_frame.stride = (((vih->bmiHeader.biWidth * vih->bmiHeader.biBitCount) + 31) & ~31) >> 3; + rgb_flip = (vih->bmiHeader.biHeight < 0 ? 0 : XVID_CSP_VFLIP); + } + else if (formattype == FORMAT_VideoInfo2) + { + VIDEOINFOHEADER2 * vih2 = (VIDEOINFOHEADER2 * )format; + //m_frame.stride = vih2->bmiHeader.biWidth; + // dev-api-3: + m_frame.stride = (((vih2->bmiHeader.biWidth * vih2->bmiHeader.biBitCount) + 31) & ~31) >> 3; + rgb_flip = (vih2->bmiHeader.biHeight < 0 ? 0 : XVID_CSP_VFLIP); + } + else + { + return S_FALSE; + } + + if (subtype == MEDIASUBTYPE_IYUV) + { + DEBUG("IYUV"); + m_frame.colorspace = XVID_CSP_I420; + } + else if (subtype == MEDIASUBTYPE_YV12) { DEBUG("YV12"); m_frame.colorspace = XVID_CSP_YV12; @@ -408,22 +470,22 @@ else if (subtype == MEDIASUBTYPE_RGB32) { DEBUG("RGB32"); - m_frame.colorspace = XVID_CSP_VFLIP | XVID_CSP_RGB32; + m_frame.colorspace = rgb_flip | XVID_CSP_RGB32; } else if (subtype == MEDIASUBTYPE_RGB24) { DEBUG("RGB24"); - m_frame.colorspace = XVID_CSP_VFLIP | XVID_CSP_RGB24; + m_frame.colorspace = rgb_flip | XVID_CSP_RGB24; } else if (subtype == MEDIASUBTYPE_RGB555) { DEBUG("RGB555"); - m_frame.colorspace = XVID_CSP_VFLIP | XVID_CSP_RGB555; + m_frame.colorspace = rgb_flip | XVID_CSP_RGB555; } else if (subtype == MEDIASUBTYPE_RGB565) { DEBUG("RGB565"); - m_frame.colorspace = XVID_CSP_VFLIP | XVID_CSP_RGB565; + m_frame.colorspace = rgb_flip | XVID_CSP_RGB565; } else if (subtype == GUID_NULL) { @@ -434,22 +496,6 @@ return S_FALSE; } - - if (formattype == FORMAT_VideoInfo) - { - VIDEOINFOHEADER * vih = (VIDEOINFOHEADER * )format; - m_frame.stride = vih->bmiHeader.biWidth; - } - else if (formattype == FORMAT_VideoInfo2) - { - VIDEOINFOHEADER2 * vih2 = (VIDEOINFOHEADER2 * )format; - m_frame.stride = vih2->bmiHeader.biWidth; - } - else - { - return S_FALSE; - } - return S_OK; }