|
29 | 29 | #include "mfx_c2_allocator_id.h" |
30 | 30 | #include "mfx_c2_buffer_queue.h" |
31 | 31 | #include "C2PlatformSupport.h" |
| 32 | +#include "mfx_c2_color_aspects_utils.h" |
32 | 33 |
|
33 | 34 | #include <C2AllocatorGralloc.h> |
34 | 35 | #include <Codec2Mapper.h> |
@@ -172,8 +173,6 @@ MfxC2DecoderComponent::MfxC2DecoderComponent(const C2String name, const CreateCo |
172 | 173 | { |
173 | 174 | MFX_DEBUG_TRACE_FUNC; |
174 | 175 | const unsigned int SINGLE_STREAM_ID = 0u; |
175 | | - uint32_t max_w = 0u; |
176 | | - uint32_t max_h = 0u; |
177 | 176 |
|
178 | 177 | addParameter( |
179 | 178 | DefineParam(m_kind, C2_PARAMKEY_COMPONENT_KIND) |
@@ -588,42 +587,43 @@ MfxC2DecoderComponent::MfxC2DecoderComponent(const C2String name, const CreateCo |
588 | 587 | .withSetter(DefaultColorAspectsSetter) |
589 | 588 | .build()); |
590 | 589 |
|
591 | | - addParameter( |
592 | | - DefineParam(m_codedColorAspects, C2_PARAMKEY_VUI_COLOR_ASPECTS) |
593 | | - .withDefault(new C2StreamColorAspectsInfo::input( |
594 | | - SINGLE_STREAM_ID, C2Color::RANGE_LIMITED, C2Color::PRIMARIES_UNSPECIFIED, |
595 | | - C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED)) |
596 | | - .withFields({ |
597 | | - C2F(m_codedColorAspects, range).inRange( |
598 | | - C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER), |
599 | | - C2F(m_codedColorAspects, primaries).inRange( |
600 | | - C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER), |
601 | | - C2F(m_codedColorAspects, transfer).inRange( |
602 | | - C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER), |
603 | | - C2F(m_codedColorAspects, matrix).inRange( |
604 | | - C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER) |
605 | | - }) |
606 | | - .withSetter(CodedColorAspectsSetter) |
607 | | - .build()); |
608 | | - |
609 | | - addParameter( |
610 | | - DefineParam(m_colorAspects, C2_PARAMKEY_COLOR_ASPECTS) |
611 | | - .withDefault(new C2StreamColorAspectsInfo::output( |
612 | | - SINGLE_STREAM_ID, C2Color::RANGE_UNSPECIFIED, C2Color::PRIMARIES_UNSPECIFIED, |
613 | | - C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED)) |
614 | | - .withFields({ |
615 | | - C2F(m_colorAspects, range).inRange( |
616 | | - C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER), |
617 | | - C2F(m_colorAspects, primaries).inRange( |
618 | | - C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER), |
619 | | - C2F(m_colorAspects, transfer).inRange( |
620 | | - C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER), |
621 | | - C2F(m_colorAspects, matrix).inRange( |
622 | | - C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER) |
623 | | - }) |
624 | | - .withSetter(ColorAspectsSetter, m_defaultColorAspects, m_codedColorAspects) |
625 | | - .build()); |
626 | | - |
| 590 | + if (DECODER_VP9 != m_decoderType && DECODER_VP8 != m_decoderType) { |
| 591 | + addParameter( |
| 592 | + DefineParam(m_inColorAspects, C2_PARAMKEY_VUI_COLOR_ASPECTS) |
| 593 | + .withDefault(new C2StreamColorAspectsInfo::input( |
| 594 | + SINGLE_STREAM_ID, C2Color::RANGE_LIMITED, C2Color::PRIMARIES_UNSPECIFIED, |
| 595 | + C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED)) |
| 596 | + .withFields({ |
| 597 | + C2F(m_inColorAspects, range).inRange( |
| 598 | + C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER), |
| 599 | + C2F(m_inColorAspects, primaries).inRange( |
| 600 | + C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER), |
| 601 | + C2F(m_inColorAspects, transfer).inRange( |
| 602 | + C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER), |
| 603 | + C2F(m_inColorAspects, matrix).inRange( |
| 604 | + C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER) |
| 605 | + }) |
| 606 | + .withSetter(CodedColorAspectsSetter) |
| 607 | + .build()); |
| 608 | + |
| 609 | + addParameter( |
| 610 | + DefineParam(m_outColorAspects, C2_PARAMKEY_COLOR_ASPECTS) |
| 611 | + .withDefault(new C2StreamColorAspectsInfo::output( |
| 612 | + SINGLE_STREAM_ID, C2Color::RANGE_UNSPECIFIED, C2Color::PRIMARIES_UNSPECIFIED, |
| 613 | + C2Color::TRANSFER_UNSPECIFIED, C2Color::MATRIX_UNSPECIFIED)) |
| 614 | + .withFields({ |
| 615 | + C2F(m_outColorAspects, range).inRange( |
| 616 | + C2Color::RANGE_UNSPECIFIED, C2Color::RANGE_OTHER), |
| 617 | + C2F(m_outColorAspects, primaries).inRange( |
| 618 | + C2Color::PRIMARIES_UNSPECIFIED, C2Color::PRIMARIES_OTHER), |
| 619 | + C2F(m_outColorAspects, transfer).inRange( |
| 620 | + C2Color::TRANSFER_UNSPECIFIED, C2Color::TRANSFER_OTHER), |
| 621 | + C2F(m_outColorAspects, matrix).inRange( |
| 622 | + C2Color::MATRIX_UNSPECIFIED, C2Color::MATRIX_OTHER) |
| 623 | + }) |
| 624 | + .withSetter(ColorAspectsSetter, m_defaultColorAspects, m_inColorAspects) |
| 625 | + .build()); |
| 626 | + } |
627 | 627 | // Pixel format info. Set to NV12 by default |
628 | 628 | m_pixelFormat = std::make_unique<C2StreamPixelFormatInfo::output>(SINGLE_STREAM_ID, HAL_PIXEL_FORMAT_NV12_Y_TILED_INTEL); |
629 | 629 |
|
@@ -1027,8 +1027,7 @@ mfxStatus MfxC2DecoderComponent::ResetSettings() |
1027 | 1027 | break; |
1028 | 1028 | } |
1029 | 1029 |
|
1030 | | - m_colorAspectsWrapper.SetCodecID(m_mfxVideoParams.mfx.CodecId); |
1031 | | - |
| 1030 | + m_signalInfo.VideoFullRange = 2; // UNSPECIFIED Range |
1032 | 1031 | mfx_set_defaults_mfxVideoParam_dec(&m_mfxVideoParams); |
1033 | 1032 |
|
1034 | 1033 | if (m_device) |
@@ -1158,8 +1157,8 @@ mfxStatus MfxC2DecoderComponent::InitDecoder(std::shared_ptr<C2BlockPool> c2_all |
1158 | 1157 | } |
1159 | 1158 |
|
1160 | 1159 | if (MFX_ERR_NONE == mfx_res) { |
1161 | | - MFX_DEBUG_TRACE_MSG("InitDecoder: UpdateBitstreamColorAspects"); |
1162 | | - m_colorAspectsWrapper.UpdateBitstreamColorAspects(m_signalInfo); |
| 1160 | + MFX_DEBUG_TRACE_MSG("InitDecoder: UpdateColorAspectsFromBitstream"); |
| 1161 | + UpdateColorAspectsFromBitstream(m_signalInfo); |
1163 | 1162 |
|
1164 | 1163 | MFX_DEBUG_TRACE_MSG("InitDecoder: GetAsyncDepth"); |
1165 | 1164 | m_mfxVideoParams.AsyncDepth = GetAsyncDepth(); |
@@ -1360,22 +1359,6 @@ c2_status_t MfxC2DecoderComponent::UpdateC2Param(const mfxVideoParam* src, C2Par |
1360 | 1359 | } |
1361 | 1360 | break; |
1362 | 1361 | } |
1363 | | - case kParamIndexColorAspects: { |
1364 | | - auto color = getColorAspects_l(); |
1365 | | - m_colorAspects->range = color->range; |
1366 | | - m_colorAspects->primaries = color->primaries; |
1367 | | - m_colorAspects->transfer = color->transfer; |
1368 | | - m_colorAspects->matrix = color->matrix; |
1369 | | - break; |
1370 | | - } |
1371 | | - case kParamIndexDefaultColorAspects: { |
1372 | | - auto color = getColorAspects_l(); |
1373 | | - m_defaultColorAspects->range = color->range; |
1374 | | - m_defaultColorAspects->primaries = color->primaries; |
1375 | | - m_defaultColorAspects->transfer = color->transfer; |
1376 | | - m_defaultColorAspects->matrix = color->matrix; |
1377 | | - break; |
1378 | | - } |
1379 | 1362 | default: |
1380 | 1363 | MFX_DEBUG_TRACE_STREAM("attempt to query " |
1381 | 1364 | << index.typeIndex() << " type, but not found."); |
@@ -1472,52 +1455,6 @@ void MfxC2DecoderComponent::DoUpdateMfxParam(const std::vector<C2Param*> ¶ms |
1472 | 1455 | } |
1473 | 1456 | break; |
1474 | 1457 | } |
1475 | | - case kParamIndexColorAspects: { |
1476 | | - android::ColorAspects ca; |
1477 | | - MFX_DEBUG_TRACE_U32(m_colorAspects->range); |
1478 | | - MFX_DEBUG_TRACE_U32(m_colorAspects->primaries); |
1479 | | - MFX_DEBUG_TRACE_U32(m_colorAspects->transfer); |
1480 | | - MFX_DEBUG_TRACE_U32(m_colorAspects->matrix); |
1481 | | - |
1482 | | - ca.mRange = (android::ColorAspects::Range)m_colorAspects->range; |
1483 | | - ca.mTransfer = (android::ColorAspects::Transfer)m_colorAspects->transfer; |
1484 | | - ca.mMatrixCoeffs = (android::ColorAspects::MatrixCoeffs)m_colorAspects->matrix; |
1485 | | - ca.mPrimaries = (android::ColorAspects::Primaries)m_colorAspects->primaries; |
1486 | | - |
1487 | | - mfxExtVideoSignalInfo signal_info; |
1488 | | - MFX_ZERO_MEMORY(signal_info); |
1489 | | - signal_info.VideoFullRange = m_colorAspects->range; |
1490 | | - signal_info.ColourPrimaries = m_colorAspects->primaries; |
1491 | | - signal_info.TransferCharacteristics = m_colorAspects->transfer; |
1492 | | - signal_info.MatrixCoefficients = m_colorAspects->matrix; |
1493 | | - |
1494 | | - m_colorAspectsWrapper.UpdateBitstreamColorAspects(signal_info); |
1495 | | - m_colorAspectsWrapper.SetFrameworkColorAspects(ca); |
1496 | | - break; |
1497 | | - } |
1498 | | - case kParamIndexDefaultColorAspects: { |
1499 | | - android::ColorAspects ca; |
1500 | | - MFX_DEBUG_TRACE_U32(m_defaultColorAspects->range); |
1501 | | - MFX_DEBUG_TRACE_U32(m_defaultColorAspects->primaries); |
1502 | | - MFX_DEBUG_TRACE_U32(m_defaultColorAspects->transfer); |
1503 | | - MFX_DEBUG_TRACE_U32(m_defaultColorAspects->matrix); |
1504 | | - |
1505 | | - ca.mRange = (android::ColorAspects::Range)m_defaultColorAspects->range; |
1506 | | - ca.mTransfer = (android::ColorAspects::Transfer)m_defaultColorAspects->transfer; |
1507 | | - ca.mMatrixCoeffs = (android::ColorAspects::MatrixCoeffs)m_defaultColorAspects->matrix; |
1508 | | - ca.mPrimaries = (android::ColorAspects::Primaries)m_defaultColorAspects->primaries; |
1509 | | - |
1510 | | - mfxExtVideoSignalInfo signal_info; |
1511 | | - MFX_ZERO_MEMORY(signal_info); |
1512 | | - signal_info.VideoFullRange = m_defaultColorAspects->range; |
1513 | | - signal_info.ColourPrimaries = m_defaultColorAspects->primaries; |
1514 | | - signal_info.TransferCharacteristics = m_defaultColorAspects->transfer; |
1515 | | - signal_info.MatrixCoefficients = m_defaultColorAspects->matrix; |
1516 | | - |
1517 | | - m_colorAspectsWrapper.UpdateBitstreamColorAspects(signal_info); |
1518 | | - m_colorAspectsWrapper.SetFrameworkColorAspects(ca); |
1519 | | - break; |
1520 | | - } |
1521 | 1458 | default: |
1522 | 1459 | MFX_DEBUG_TRACE_STREAM("attempt to configure " |
1523 | 1460 | << C2Param::Type(param->type()).typeIndex() << " type, but not found"); |
@@ -2393,18 +2330,12 @@ void MfxC2DecoderComponent::WaitWork(MfxC2FrameOut&& frame_out, mfxSyncPoint syn |
2393 | 2330 | // set pixel info |
2394 | 2331 | out_buffer->setInfo(m_pixelFormat); |
2395 | 2332 |
|
2396 | | - // set color aspects info |
2397 | | - out_buffer->setInfo(getColorAspects_l()); |
2398 | | - |
2399 | | - if (m_colorAspectsWrapper.IsColorAspectsChanged()) { |
2400 | | - m_colorAspectsWrapper.SignalChangedColorAspectsIsSent(); |
2401 | | - } |
2402 | 2333 |
|
2403 | 2334 | std::unique_ptr<C2Worklet>& worklet = work->worklets.front(); |
2404 | 2335 | // Pass end of stream flag only. |
2405 | 2336 | worklet->output.flags = (C2FrameData::flags_t)(work->input.flags & C2FrameData::FLAG_END_OF_STREAM); |
2406 | 2337 | worklet->output.ordinal = work->input.ordinal; |
2407 | | - if (m_mfxVideoParams.mfx.FrameInfo.Width != m_size->width || m_mfxVideoParams.mfx.FrameInfo.Height != m_size->height) { |
| 2338 | + if (m_mfxVideoParams.mfx.FrameInfo.Width != m_size->width || m_mfxVideoParams.mfx.FrameInfo.Height != m_size->height) { |
2408 | 2339 | MFX_DEBUG_TRACE_STREAM("find m_size different from m_mfxVideoParams, update width from " << m_size->width |
2409 | 2340 | << " to " << m_mfxVideoParams.mfx.FrameInfo.Width << ", height from " << m_size->height |
2410 | 2341 | << " to " << m_mfxVideoParams.mfx.FrameInfo.Height); |
@@ -2677,31 +2608,52 @@ void MfxC2DecoderComponent::UpdateHdrStaticInfo() |
2677 | 2608 | MFX_DEBUG_TRACE__hdrStaticInfo(m_hdrStaticInfo); |
2678 | 2609 | } |
2679 | 2610 |
|
2680 | | -std::shared_ptr<C2StreamColorAspectsInfo::output> MfxC2DecoderComponent::getColorAspects_l() const { |
| 2611 | +void MfxC2DecoderComponent::UpdateColorAspectsFromBitstream(const mfxExtVideoSignalInfo &signalInfo) |
| 2612 | +{ |
2681 | 2613 | MFX_DEBUG_TRACE_FUNC; |
2682 | | - android::ColorAspects sfAspects; |
2683 | | - std::shared_ptr<C2StreamColorAspectsInfo::output> codedAspects = std::make_shared<C2StreamColorAspectsInfo::output>(0u); |
2684 | | - if (!codedAspects) return nullptr; |
2685 | 2614 |
|
2686 | | - m_colorAspectsWrapper.GetOutputColorAspects(sfAspects); |
| 2615 | + if (DECODER_VP9 == m_decoderType || DECODER_VP8 == m_decoderType) return; |
| 2616 | + |
| 2617 | + MFX_DEBUG_TRACE_I32(signalInfo.VideoFullRange); |
| 2618 | + MFX_DEBUG_TRACE_I32(signalInfo.ColourPrimaries); |
| 2619 | + MFX_DEBUG_TRACE_I32(signalInfo.TransferCharacteristics); |
| 2620 | + MFX_DEBUG_TRACE_I32(signalInfo.MatrixCoefficients); |
2687 | 2621 |
|
2688 | | - if (!C2Mapper::map(sfAspects.mPrimaries, &codedAspects->primaries)) { |
2689 | | - codedAspects->primaries = C2Color::PRIMARIES_UNSPECIFIED; |
| 2622 | + android::ColorAspects bitstreamColorAspects; |
| 2623 | + |
| 2624 | + MfxC2ColorAspectsUtils::MfxToC2VideoRange(signalInfo.VideoFullRange, bitstreamColorAspects.mRange); |
| 2625 | + MfxC2ColorAspectsUtils::MfxToC2ColourPrimaries(signalInfo.ColourPrimaries, bitstreamColorAspects.mPrimaries); |
| 2626 | + MfxC2ColorAspectsUtils::MfxToC2TransferCharacteristics(signalInfo.TransferCharacteristics, bitstreamColorAspects.mTransfer); |
| 2627 | + MfxC2ColorAspectsUtils::MfxToC2MatrixCoefficients(signalInfo.MatrixCoefficients, bitstreamColorAspects.mMatrixCoeffs); |
| 2628 | + |
| 2629 | + if (!C2Mapper::map(bitstreamColorAspects.mRange, &m_outColorAspects->range)) { |
| 2630 | + m_outColorAspects->range = C2Color::RANGE_UNSPECIFIED; |
2690 | 2631 | } |
2691 | | - if (!C2Mapper::map(sfAspects.mRange, &codedAspects->range)) { |
2692 | | - codedAspects->range = C2Color::RANGE_UNSPECIFIED; |
| 2632 | + if (!C2Mapper::map(bitstreamColorAspects.mPrimaries, &m_outColorAspects->primaries)) { |
| 2633 | + m_outColorAspects->primaries = C2Color::PRIMARIES_UNSPECIFIED; |
2693 | 2634 | } |
2694 | | - if (!C2Mapper::map(sfAspects.mMatrixCoeffs, &codedAspects->matrix)) { |
2695 | | - codedAspects->matrix = C2Color::MATRIX_UNSPECIFIED; |
| 2635 | + if (!C2Mapper::map(bitstreamColorAspects.mTransfer, &m_outColorAspects->transfer)) { |
| 2636 | + m_outColorAspects->transfer = C2Color::TRANSFER_UNSPECIFIED; |
2696 | 2637 | } |
2697 | | - if (!C2Mapper::map(sfAspects.mTransfer, &codedAspects->transfer)) { |
2698 | | - codedAspects->transfer = C2Color::TRANSFER_UNSPECIFIED; |
| 2638 | + if (!C2Mapper::map(bitstreamColorAspects.mMatrixCoeffs, &m_outColorAspects->matrix)) { |
| 2639 | + m_outColorAspects->matrix = C2Color::MATRIX_UNSPECIFIED; |
2699 | 2640 | } |
2700 | 2641 |
|
2701 | | - MFX_DEBUG_TRACE_I32(codedAspects->primaries); |
2702 | | - MFX_DEBUG_TRACE_I32(codedAspects->range); |
2703 | | - MFX_DEBUG_TRACE_I32(codedAspects->matrix); |
2704 | | - MFX_DEBUG_TRACE_I32(codedAspects->transfer); |
| 2642 | + // VideoFormat == 5 indicates that video_format syntax element is not present |
| 2643 | + if (signalInfo.VideoFormat == 5 && signalInfo.VideoFullRange == 0 && signalInfo.ColourDescriptionPresent == 0) { |
| 2644 | + m_outColorAspects->range = C2Color::RANGE_UNSPECIFIED; |
| 2645 | + m_outColorAspects->primaries = C2Color::PRIMARIES_UNSPECIFIED; |
| 2646 | + m_outColorAspects->transfer = C2Color::TRANSFER_UNSPECIFIED; |
| 2647 | + m_outColorAspects->matrix = C2Color::MATRIX_UNSPECIFIED; |
| 2648 | + } |
2705 | 2649 |
|
2706 | | - return codedAspects; |
| 2650 | + if (C2Color::RANGE_UNSPECIFIED != m_outColorAspects->range || C2Color::PRIMARIES_UNSPECIFIED != m_outColorAspects->primaries |
| 2651 | + || C2Color::TRANSFER_UNSPECIFIED != m_outColorAspects->transfer || C2Color::MATRIX_UNSPECIFIED != m_outColorAspects->matrix) { |
| 2652 | + MFX_DEBUG_TRACE_MSG("m_outColorAspects have been changed by decoderHeader."); |
| 2653 | + MFX_DEBUG_TRACE_I32(m_outColorAspects->range); |
| 2654 | + MFX_DEBUG_TRACE_I32(m_outColorAspects->primaries); |
| 2655 | + MFX_DEBUG_TRACE_I32(m_outColorAspects->transfer); |
| 2656 | + MFX_DEBUG_TRACE_I32(m_outColorAspects->matrix); |
| 2657 | + m_updatingC2Configures.push_back(C2Param::Copy(*m_outColorAspects)); |
| 2658 | + } |
2707 | 2659 | } |
0 commit comments