290 |
|
|
291 |
/* get list of supported output colorspaces */ |
/* get list of supported output colorspaces */ |
292 |
|
|
|
#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 |
|
|
|
|
293 |
HRESULT CXvidDecoder::GetMediaType(int iPosition, CMediaType *mtOut) |
HRESULT CXvidDecoder::GetMediaType(int iPosition, CMediaType *mtOut) |
294 |
{ |
{ |
295 |
DEBUG("GetMediaType"); |
DEBUG("GetMediaType"); |
319 |
switch(iPosition) |
switch(iPosition) |
320 |
{ |
{ |
321 |
case 0 : |
case 0 : |
|
#ifdef ENABLE_IYUV |
|
322 |
vih->bmiHeader.biCompression = MEDIASUBTYPE_IYUV.Data1; |
vih->bmiHeader.biCompression = MEDIASUBTYPE_IYUV.Data1; |
323 |
vih->bmiHeader.biBitCount = 12; |
vih->bmiHeader.biBitCount = 12; |
324 |
mtOut->SetSubtype(&MEDIASUBTYPE_IYUV); |
mtOut->SetSubtype(&MEDIASUBTYPE_IYUV); |
325 |
break; |
break; |
|
#endif |
|
326 |
|
|
327 |
case 1: |
case 1: |
|
#ifdef ENABLE_YV12 |
|
328 |
vih->bmiHeader.biCompression = MEDIASUBTYPE_YV12.Data1; |
vih->bmiHeader.biCompression = MEDIASUBTYPE_YV12.Data1; |
329 |
vih->bmiHeader.biBitCount = 12; |
vih->bmiHeader.biBitCount = 12; |
330 |
mtOut->SetSubtype(&MEDIASUBTYPE_YV12); |
mtOut->SetSubtype(&MEDIASUBTYPE_YV12); |
331 |
break; |
break; |
|
#endif |
|
332 |
|
|
333 |
case 2: |
case 2: |
|
#ifdef ENABLE_YUY2 |
|
334 |
vih->bmiHeader.biCompression = MEDIASUBTYPE_YUY2.Data1; |
vih->bmiHeader.biCompression = MEDIASUBTYPE_YUY2.Data1; |
335 |
vih->bmiHeader.biBitCount = 16; |
vih->bmiHeader.biBitCount = 16; |
336 |
mtOut->SetSubtype(&MEDIASUBTYPE_YUY2); |
mtOut->SetSubtype(&MEDIASUBTYPE_YUY2); |
337 |
break; |
break; |
|
#endif |
|
338 |
|
|
339 |
case 3: |
case 3: |
|
#ifdef ENABLE_YVYU |
|
340 |
vih->bmiHeader.biCompression = MEDIASUBTYPE_YVYU.Data1; |
vih->bmiHeader.biCompression = MEDIASUBTYPE_YVYU.Data1; |
341 |
vih->bmiHeader.biBitCount = 16; |
vih->bmiHeader.biBitCount = 16; |
342 |
mtOut->SetSubtype(&MEDIASUBTYPE_YVYU); |
mtOut->SetSubtype(&MEDIASUBTYPE_YVYU); |
343 |
break; |
break; |
|
#endif |
|
344 |
|
|
345 |
case 4: |
case 4: |
|
#ifdef ENABLE_UYVY |
|
346 |
vih->bmiHeader.biCompression = MEDIASUBTYPE_UYVY.Data1; |
vih->bmiHeader.biCompression = MEDIASUBTYPE_UYVY.Data1; |
347 |
vih->bmiHeader.biBitCount = 16; |
vih->bmiHeader.biBitCount = 16; |
348 |
mtOut->SetSubtype(&MEDIASUBTYPE_UYVY); |
mtOut->SetSubtype(&MEDIASUBTYPE_UYVY); |
349 |
break; |
break; |
|
#endif |
|
350 |
|
|
351 |
case 5: |
case 5: |
|
#ifdef ENABLE_RGB32 |
|
352 |
vih->bmiHeader.biCompression = BI_RGB; |
vih->bmiHeader.biCompression = BI_RGB; |
353 |
vih->bmiHeader.biBitCount = 32; |
vih->bmiHeader.biBitCount = 32; |
354 |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB32); |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB32); |
355 |
break; |
break; |
|
#endif |
|
356 |
|
|
357 |
case 6: |
case 6: |
|
#ifdef ENABLE_RGB24 |
|
358 |
vih->bmiHeader.biCompression = BI_RGB; |
vih->bmiHeader.biCompression = BI_RGB; |
359 |
vih->bmiHeader.biBitCount = 24; |
vih->bmiHeader.biBitCount = 24; |
360 |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB24); |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB24); |
361 |
break; |
break; |
|
#endif |
|
362 |
|
|
363 |
case 7: |
case 7: |
|
#ifdef ENABLE_RGB565 |
|
364 |
vih->bmiHeader.biCompression = BI_RGB; |
vih->bmiHeader.biCompression = BI_RGB; |
365 |
vih->bmiHeader.biBitCount = 16; |
vih->bmiHeader.biBitCount = 16; |
366 |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB565); |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB555); |
367 |
break; |
break; |
|
#endif |
|
368 |
|
|
369 |
case 8: |
case 8: |
|
#ifdef ENABLE_RGB555 |
|
370 |
vih->bmiHeader.biCompression = BI_RGB; |
vih->bmiHeader.biCompression = BI_RGB; |
371 |
vih->bmiHeader.biBitCount = 16; |
vih->bmiHeader.biBitCount = 16; |
372 |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB555); |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB565); |
373 |
break; |
break; |
|
#endif |
|
374 |
|
|
375 |
default : |
default : |
376 |
return VFW_S_NO_MORE_ITEMS; |
return VFW_S_NO_MORE_ITEMS; |
391 |
|
|
392 |
HRESULT CXvidDecoder::ChangeColorspace(GUID subtype, GUID formattype, void * format) |
HRESULT CXvidDecoder::ChangeColorspace(GUID subtype, GUID formattype, void * format) |
393 |
{ |
{ |
|
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; |
|
|
} |
|
|
|
|
394 |
if (subtype == MEDIASUBTYPE_IYUV) |
if (subtype == MEDIASUBTYPE_IYUV) |
395 |
{ |
{ |
396 |
DEBUG("IYUV"); |
DEBUG("IYUV"); |
419 |
else if (subtype == MEDIASUBTYPE_RGB32) |
else if (subtype == MEDIASUBTYPE_RGB32) |
420 |
{ |
{ |
421 |
DEBUG("RGB32"); |
DEBUG("RGB32"); |
422 |
m_frame.colorspace = rgb_flip | XVID_CSP_RGB32; |
m_frame.colorspace = XVID_CSP_VFLIP | XVID_CSP_RGB32; |
423 |
} |
} |
424 |
else if (subtype == MEDIASUBTYPE_RGB24) |
else if (subtype == MEDIASUBTYPE_RGB24) |
425 |
{ |
{ |
426 |
DEBUG("RGB24"); |
DEBUG("RGB24"); |
427 |
m_frame.colorspace = rgb_flip | XVID_CSP_RGB24; |
m_frame.colorspace = XVID_CSP_VFLIP | XVID_CSP_RGB24; |
428 |
} |
} |
429 |
else if (subtype == MEDIASUBTYPE_RGB555) |
else if (subtype == MEDIASUBTYPE_RGB555) |
430 |
{ |
{ |
431 |
DEBUG("RGB555"); |
DEBUG("RGB555"); |
432 |
m_frame.colorspace = rgb_flip | XVID_CSP_RGB555; |
m_frame.colorspace = XVID_CSP_VFLIP | XVID_CSP_RGB555; |
433 |
} |
} |
434 |
else if (subtype == MEDIASUBTYPE_RGB565) |
else if (subtype == MEDIASUBTYPE_RGB565) |
435 |
{ |
{ |
436 |
DEBUG("RGB565"); |
DEBUG("RGB565"); |
437 |
m_frame.colorspace = rgb_flip | XVID_CSP_RGB565; |
m_frame.colorspace = XVID_CSP_VFLIP | XVID_CSP_RGB565; |
438 |
} |
} |
439 |
else if (subtype == GUID_NULL) |
else if (subtype == GUID_NULL) |
440 |
{ |
{ |
445 |
return S_FALSE; |
return S_FALSE; |
446 |
} |
} |
447 |
|
|
448 |
|
|
449 |
|
if (formattype == FORMAT_VideoInfo) |
450 |
|
{ |
451 |
|
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER * )format; |
452 |
|
m_frame.stride = vih->bmiHeader.biWidth; |
453 |
|
} |
454 |
|
else if (formattype == FORMAT_VideoInfo2) |
455 |
|
{ |
456 |
|
VIDEOINFOHEADER2 * vih2 = (VIDEOINFOHEADER2 * )format; |
457 |
|
m_frame.stride = vih2->bmiHeader.biWidth; |
458 |
|
} |
459 |
|
else |
460 |
|
{ |
461 |
|
return S_FALSE; |
462 |
|
} |
463 |
|
|
464 |
return S_OK; |
return S_OK; |
465 |
|
|
466 |
} |
} |