290 |
|
|
291 |
/* get list of supported output colorspaces */ |
/* get list of supported output colorspaces */ |
292 |
|
|
293 |
|
#define ENABLE_IYUV |
294 |
|
#define ENABLE_YV12 |
295 |
|
#define ENABLE_YUY2 |
296 |
|
#define ENABLE_UYVY |
297 |
|
#define ENABLE_YVYU |
298 |
|
#define ENABLE_RGB32 |
299 |
|
#define ENABLE_RGB24 |
300 |
|
#define ENABLE_RGB565 |
301 |
|
#define ENABLE_RGB555 |
302 |
|
|
303 |
HRESULT CXvidDecoder::GetMediaType(int iPosition, CMediaType *mtOut) |
HRESULT CXvidDecoder::GetMediaType(int iPosition, CMediaType *mtOut) |
304 |
{ |
{ |
305 |
DEBUG("GetMediaType"); |
DEBUG("GetMediaType"); |
329 |
switch(iPosition) |
switch(iPosition) |
330 |
{ |
{ |
331 |
case 0 : |
case 0 : |
332 |
|
#ifdef ENABLE_IYUV |
333 |
|
vih->bmiHeader.biCompression = MEDIASUBTYPE_IYUV.Data1; |
334 |
|
vih->bmiHeader.biBitCount = 12; |
335 |
|
mtOut->SetSubtype(&MEDIASUBTYPE_IYUV); |
336 |
|
break; |
337 |
|
#endif |
338 |
|
|
339 |
|
case 1: |
340 |
|
#ifdef ENABLE_YV12 |
341 |
vih->bmiHeader.biCompression = MEDIASUBTYPE_YV12.Data1; |
vih->bmiHeader.biCompression = MEDIASUBTYPE_YV12.Data1; |
342 |
vih->bmiHeader.biBitCount = 12; |
vih->bmiHeader.biBitCount = 12; |
343 |
mtOut->SetSubtype(&MEDIASUBTYPE_YV12); |
mtOut->SetSubtype(&MEDIASUBTYPE_YV12); |
344 |
break; |
break; |
345 |
|
#endif |
346 |
|
|
347 |
case 1: |
case 2: |
348 |
|
#ifdef ENABLE_YUY2 |
349 |
vih->bmiHeader.biCompression = MEDIASUBTYPE_YUY2.Data1; |
vih->bmiHeader.biCompression = MEDIASUBTYPE_YUY2.Data1; |
350 |
vih->bmiHeader.biBitCount = 16; |
vih->bmiHeader.biBitCount = 16; |
351 |
mtOut->SetSubtype(&MEDIASUBTYPE_YUY2); |
mtOut->SetSubtype(&MEDIASUBTYPE_YUY2); |
352 |
break; |
break; |
353 |
|
#endif |
354 |
|
|
355 |
case 2: |
case 3: |
356 |
|
#ifdef ENABLE_YVYU |
357 |
vih->bmiHeader.biCompression = MEDIASUBTYPE_YVYU.Data1; |
vih->bmiHeader.biCompression = MEDIASUBTYPE_YVYU.Data1; |
358 |
vih->bmiHeader.biBitCount = 16; |
vih->bmiHeader.biBitCount = 16; |
359 |
mtOut->SetSubtype(&MEDIASUBTYPE_YVYU); |
mtOut->SetSubtype(&MEDIASUBTYPE_YVYU); |
360 |
break; |
break; |
361 |
|
#endif |
362 |
|
|
363 |
case 3: |
case 4: |
364 |
|
#ifdef ENABLE_UYVY |
365 |
vih->bmiHeader.biCompression = MEDIASUBTYPE_UYVY.Data1; |
vih->bmiHeader.biCompression = MEDIASUBTYPE_UYVY.Data1; |
366 |
vih->bmiHeader.biBitCount = 16; |
vih->bmiHeader.biBitCount = 16; |
367 |
mtOut->SetSubtype(&MEDIASUBTYPE_UYVY); |
mtOut->SetSubtype(&MEDIASUBTYPE_UYVY); |
368 |
break; |
break; |
369 |
|
#endif |
370 |
|
|
371 |
case 4: |
case 5: |
372 |
|
#ifdef ENABLE_RGB32 |
373 |
vih->bmiHeader.biCompression = BI_RGB; |
vih->bmiHeader.biCompression = BI_RGB; |
374 |
vih->bmiHeader.biBitCount = 32; |
vih->bmiHeader.biBitCount = 32; |
375 |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB32); |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB32); |
376 |
break; |
break; |
377 |
|
#endif |
378 |
|
|
379 |
case 5: |
case 6: |
380 |
|
#ifdef ENABLE_RGB24 |
381 |
vih->bmiHeader.biCompression = BI_RGB; |
vih->bmiHeader.biCompression = BI_RGB; |
382 |
vih->bmiHeader.biBitCount = 24; |
vih->bmiHeader.biBitCount = 24; |
383 |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB24); |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB24); |
384 |
break; |
break; |
385 |
|
#endif |
386 |
|
|
387 |
case 6: |
case 7: |
388 |
|
#ifdef ENABLE_RGB565 |
389 |
vih->bmiHeader.biCompression = BI_RGB; |
vih->bmiHeader.biCompression = BI_RGB; |
390 |
vih->bmiHeader.biBitCount = 16; |
vih->bmiHeader.biBitCount = 16; |
391 |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB555); |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB565); |
392 |
break; |
break; |
393 |
|
#endif |
394 |
|
|
395 |
case 7: |
case 8: |
396 |
|
#ifdef ENABLE_RGB555 |
397 |
vih->bmiHeader.biCompression = BI_RGB; |
vih->bmiHeader.biCompression = BI_RGB; |
398 |
vih->bmiHeader.biBitCount = 16; |
vih->bmiHeader.biBitCount = 16; |
399 |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB565); |
mtOut->SetSubtype(&MEDIASUBTYPE_RGB555); |
400 |
break; |
break; |
401 |
|
#endif |
402 |
|
|
403 |
default : |
default : |
404 |
return VFW_S_NO_MORE_ITEMS; |
return VFW_S_NO_MORE_ITEMS; |
419 |
|
|
420 |
HRESULT CXvidDecoder::ChangeColorspace(GUID subtype, GUID formattype, void * format) |
HRESULT CXvidDecoder::ChangeColorspace(GUID subtype, GUID formattype, void * format) |
421 |
{ |
{ |
422 |
if (subtype == MEDIASUBTYPE_YV12) |
int rgb_flip; |
423 |
|
|
424 |
|
if (formattype == FORMAT_VideoInfo) |
425 |
|
{ |
426 |
|
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER * )format; |
427 |
|
//m_frame.stride = vih->bmiHeader.biWidth; |
428 |
|
// dev-api-3: |
429 |
|
m_frame.stride = (((vih->bmiHeader.biWidth * vih->bmiHeader.biBitCount) + 31) & ~31) >> 3; |
430 |
|
rgb_flip = (vih->bmiHeader.biHeight < 0 ? 0 : XVID_CSP_VFLIP); |
431 |
|
} |
432 |
|
else if (formattype == FORMAT_VideoInfo2) |
433 |
|
{ |
434 |
|
VIDEOINFOHEADER2 * vih2 = (VIDEOINFOHEADER2 * )format; |
435 |
|
//m_frame.stride = vih2->bmiHeader.biWidth; |
436 |
|
// dev-api-3: |
437 |
|
m_frame.stride = (((vih2->bmiHeader.biWidth * vih2->bmiHeader.biBitCount) + 31) & ~31) >> 3; |
438 |
|
rgb_flip = (vih2->bmiHeader.biHeight < 0 ? 0 : XVID_CSP_VFLIP); |
439 |
|
} |
440 |
|
else |
441 |
|
{ |
442 |
|
return S_FALSE; |
443 |
|
} |
444 |
|
|
445 |
|
if (subtype == MEDIASUBTYPE_IYUV) |
446 |
|
{ |
447 |
|
DEBUG("IYUV"); |
448 |
|
m_frame.colorspace = XVID_CSP_I420; |
449 |
|
} |
450 |
|
else if (subtype == MEDIASUBTYPE_YV12) |
451 |
{ |
{ |
452 |
DEBUG("YV12"); |
DEBUG("YV12"); |
453 |
m_frame.colorspace = XVID_CSP_YV12; |
m_frame.colorspace = XVID_CSP_YV12; |
470 |
else if (subtype == MEDIASUBTYPE_RGB32) |
else if (subtype == MEDIASUBTYPE_RGB32) |
471 |
{ |
{ |
472 |
DEBUG("RGB32"); |
DEBUG("RGB32"); |
473 |
m_frame.colorspace = XVID_CSP_VFLIP | XVID_CSP_RGB32; |
m_frame.colorspace = rgb_flip | XVID_CSP_RGB32; |
474 |
} |
} |
475 |
else if (subtype == MEDIASUBTYPE_RGB24) |
else if (subtype == MEDIASUBTYPE_RGB24) |
476 |
{ |
{ |
477 |
DEBUG("RGB24"); |
DEBUG("RGB24"); |
478 |
m_frame.colorspace = XVID_CSP_VFLIP | XVID_CSP_RGB24; |
m_frame.colorspace = rgb_flip | XVID_CSP_RGB24; |
479 |
} |
} |
480 |
else if (subtype == MEDIASUBTYPE_RGB555) |
else if (subtype == MEDIASUBTYPE_RGB555) |
481 |
{ |
{ |
482 |
DEBUG("RGB555"); |
DEBUG("RGB555"); |
483 |
m_frame.colorspace = XVID_CSP_VFLIP | XVID_CSP_RGB555; |
m_frame.colorspace = rgb_flip | XVID_CSP_RGB555; |
484 |
} |
} |
485 |
else if (subtype == MEDIASUBTYPE_RGB565) |
else if (subtype == MEDIASUBTYPE_RGB565) |
486 |
{ |
{ |
487 |
DEBUG("RGB565"); |
DEBUG("RGB565"); |
488 |
m_frame.colorspace = XVID_CSP_VFLIP | XVID_CSP_RGB565; |
m_frame.colorspace = rgb_flip | XVID_CSP_RGB565; |
489 |
} |
} |
490 |
else if (subtype == GUID_NULL) |
else if (subtype == GUID_NULL) |
491 |
{ |
{ |
496 |
return S_FALSE; |
return S_FALSE; |
497 |
} |
} |
498 |
|
|
|
|
|
|
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; |
|
|
} |
|
|
|
|
499 |
return S_OK; |
return S_OK; |
500 |
|
|
501 |
} |
} |