OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/gpu/dxva_video_decode_accelerator_win.h" | 5 #include "media/gpu/dxva_video_decode_accelerator_win.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #if !defined(OS_WIN) | 9 #if !defined(OS_WIN) |
10 #error This file should only be built on Windows. | 10 #error This file should only be built on Windows. |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
451 config_changed_ = true; | 451 config_changed_ = true; |
452 } else { | 452 } else { |
453 pending_config_changed_ = true; | 453 pending_config_changed_ = true; |
454 } | 454 } |
455 } | 455 } |
456 last_pps_.swap(pps); | 456 last_pps_.swap(pps); |
457 } | 457 } |
458 return true; | 458 return true; |
459 } | 459 } |
460 | 460 |
461 gfx::ColorSpace H264ConfigChangeDetector::current_color_space() const { | |
462 // TODO(hubbe): Is using last_sps_id_ correct here? | |
463 const H264SPS* sps = parser_->GetSPS(last_sps_id_); | |
464 if (sps) | |
465 return sps->GetColorSpace(); | |
466 return gfx::ColorSpace(); | |
467 } | |
461 | 468 |
462 DXVAVideoDecodeAccelerator::PendingSampleInfo::PendingSampleInfo( | 469 DXVAVideoDecodeAccelerator::PendingSampleInfo::PendingSampleInfo( |
463 int32_t buffer_id, | 470 int32_t buffer_id, |
464 IMFSample* sample) | 471 IMFSample* sample, |
465 : input_buffer_id(buffer_id), picture_buffer_id(-1) { | 472 const gfx::ColorSpace& color_space) |
473 : input_buffer_id(buffer_id), | |
474 picture_buffer_id(-1), | |
475 color_space(color_space) { | |
466 output_sample.Attach(sample); | 476 output_sample.Attach(sample); |
467 } | 477 } |
468 | 478 |
469 DXVAVideoDecodeAccelerator::PendingSampleInfo::PendingSampleInfo( | 479 DXVAVideoDecodeAccelerator::PendingSampleInfo::PendingSampleInfo( |
470 const PendingSampleInfo& other) = default; | 480 const PendingSampleInfo& other) = default; |
471 | 481 |
472 DXVAVideoDecodeAccelerator::PendingSampleInfo::~PendingSampleInfo() {} | 482 DXVAVideoDecodeAccelerator::PendingSampleInfo::~PendingSampleInfo() {} |
473 | 483 |
474 DXVAVideoDecodeAccelerator::DXVAVideoDecodeAccelerator( | 484 DXVAVideoDecodeAccelerator::DXVAVideoDecodeAccelerator( |
475 const GetGLContextCallback& get_gl_context_cb, | 485 const GetGLContextCallback& get_gl_context_cb, |
(...skipping 1111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1587 DVLOG(1) << "Flags: " << std::hex << std::showbase | 1597 DVLOG(1) << "Flags: " << std::hex << std::showbase |
1588 << output_stream_info_.dwFlags; | 1598 << output_stream_info_.dwFlags; |
1589 if (codec_ == kCodecH264) { | 1599 if (codec_ == kCodecH264) { |
1590 CHECK_EQ(output_stream_info_.dwFlags, 0x107u); | 1600 CHECK_EQ(output_stream_info_.dwFlags, 0x107u); |
1591 } | 1601 } |
1592 DVLOG(1) << "Min buffer size: " << output_stream_info_.cbSize; | 1602 DVLOG(1) << "Min buffer size: " << output_stream_info_.cbSize; |
1593 DVLOG(1) << "Alignment: " << output_stream_info_.cbAlignment; | 1603 DVLOG(1) << "Alignment: " << output_stream_info_.cbAlignment; |
1594 return true; | 1604 return true; |
1595 } | 1605 } |
1596 | 1606 |
1597 void DXVAVideoDecodeAccelerator::DoDecode() { | 1607 void DXVAVideoDecodeAccelerator::DoDecode(const gfx::ColorSpace& color_space) { |
jbauman
2016/09/23 00:55:25
Another idea would be to get the color space from
hubbe
2016/09/23 04:43:01
Not a bad idea, but MS enum doesn't seem to contai
| |
1598 TRACE_EVENT0("media", "DXVAVideoDecodeAccelerator::DoDecode"); | 1608 TRACE_EVENT0("media", "DXVAVideoDecodeAccelerator::DoDecode"); |
1599 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); | 1609 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); |
1600 // This function is also called from FlushInternal in a loop which could | 1610 // This function is also called from FlushInternal in a loop which could |
1601 // result in the state transitioning to kStopped due to no decoded output. | 1611 // result in the state transitioning to kStopped due to no decoded output. |
1602 State state = GetState(); | 1612 State state = GetState(); |
1603 RETURN_AND_NOTIFY_ON_FAILURE( | 1613 RETURN_AND_NOTIFY_ON_FAILURE( |
1604 (state == kNormal || state == kFlushing || state == kStopped), | 1614 (state == kNormal || state == kFlushing || state == kStopped), |
1605 "DoDecode: not in normal/flushing/stopped state", ILLEGAL_STATE, ); | 1615 "DoDecode: not in normal/flushing/stopped state", ILLEGAL_STATE, ); |
1606 | 1616 |
1607 MFT_OUTPUT_DATA_BUFFER output_data_buffer = {0}; | 1617 MFT_OUTPUT_DATA_BUFFER output_data_buffer = {0}; |
1608 DWORD status = 0; | 1618 DWORD status = 0; |
1609 | |
1610 HRESULT hr = decoder_->ProcessOutput(0, // No flags | 1619 HRESULT hr = decoder_->ProcessOutput(0, // No flags |
1611 1, // # of out streams to pull from | 1620 1, // # of out streams to pull from |
1612 &output_data_buffer, &status); | 1621 &output_data_buffer, &status); |
1613 IMFCollection* events = output_data_buffer.pEvents; | 1622 IMFCollection* events = output_data_buffer.pEvents; |
1614 if (events != NULL) { | 1623 if (events != NULL) { |
1615 DVLOG(1) << "Got events from ProcessOuput, but discarding"; | 1624 DVLOG(1) << "Got events from ProcessOuput, but discarding"; |
1616 events->Release(); | 1625 events->Release(); |
1617 } | 1626 } |
1618 if (FAILED(hr)) { | 1627 if (FAILED(hr)) { |
1619 // A stream change needs further ProcessInput calls to get back decoder | 1628 // A stream change needs further ProcessInput calls to get back decoder |
1620 // output which is why we need to set the state to stopped. | 1629 // output which is why we need to set the state to stopped. |
1621 if (hr == MF_E_TRANSFORM_STREAM_CHANGE) { | 1630 if (hr == MF_E_TRANSFORM_STREAM_CHANGE) { |
1622 if (!SetDecoderOutputMediaType(MFVideoFormat_NV12) && | 1631 if (!SetDecoderOutputMediaType(MFVideoFormat_NV12) && |
1623 !SetDecoderOutputMediaType(MFVideoFormat_P010)) { | 1632 !SetDecoderOutputMediaType(MFVideoFormat_P010)) { |
1624 // Decoder didn't let us set NV12 output format. Not sure as to why | 1633 // Decoder didn't let us set NV12 output format. Not sure as to why |
1625 // this can happen. Give up in disgust. | 1634 // this can happen. Give up in disgust. |
1626 NOTREACHED() << "Failed to set decoder output media type to NV12"; | 1635 NOTREACHED() << "Failed to set decoder output media type to NV12"; |
1627 SetState(kStopped); | 1636 SetState(kStopped); |
1628 } else { | 1637 } else { |
1629 DVLOG(1) << "Received output format change from the decoder." | 1638 DVLOG(1) << "Received output format change from the decoder." |
1630 " Recursively invoking DoDecode"; | 1639 " Recursively invoking DoDecode"; |
1631 DoDecode(); | 1640 DoDecode(color_space); |
1632 } | 1641 } |
1633 return; | 1642 return; |
1634 } else if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) { | 1643 } else if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) { |
1635 // No more output from the decoder. Stop playback. | 1644 // No more output from the decoder. Stop playback. |
1636 SetState(kStopped); | 1645 SetState(kStopped); |
1637 return; | 1646 return; |
1638 } else { | 1647 } else { |
1639 NOTREACHED() << "Unhandled error in DoDecode()"; | 1648 NOTREACHED() << "Unhandled error in DoDecode()"; |
1640 return; | 1649 return; |
1641 } | 1650 } |
1642 } | 1651 } |
1643 TRACE_EVENT_ASYNC_END0("gpu", "DXVAVideoDecodeAccelerator.Decoding", this); | 1652 TRACE_EVENT_ASYNC_END0("gpu", "DXVAVideoDecodeAccelerator.Decoding", this); |
1644 | 1653 |
1645 TRACE_COUNTER1("DXVA Decoding", "TotalPacketsBeforeDecode", | 1654 TRACE_COUNTER1("DXVA Decoding", "TotalPacketsBeforeDecode", |
1646 inputs_before_decode_); | 1655 inputs_before_decode_); |
1647 | 1656 |
1648 inputs_before_decode_ = 0; | 1657 inputs_before_decode_ = 0; |
1649 | 1658 |
1650 RETURN_AND_NOTIFY_ON_FAILURE(ProcessOutputSample(output_data_buffer.pSample), | 1659 RETURN_AND_NOTIFY_ON_FAILURE( |
1651 "Failed to process output sample.", | 1660 ProcessOutputSample(output_data_buffer.pSample, color_space), |
1652 PLATFORM_FAILURE, ); | 1661 "Failed to process output sample.", PLATFORM_FAILURE, ); |
1653 } | 1662 } |
1654 | 1663 |
1655 bool DXVAVideoDecodeAccelerator::ProcessOutputSample(IMFSample* sample) { | 1664 bool DXVAVideoDecodeAccelerator::ProcessOutputSample( |
1665 IMFSample* sample, | |
1666 const gfx::ColorSpace& color_space) { | |
1656 RETURN_ON_FAILURE(sample, "Decode succeeded with NULL output sample", false); | 1667 RETURN_ON_FAILURE(sample, "Decode succeeded with NULL output sample", false); |
1657 | 1668 |
1658 LONGLONG input_buffer_id = 0; | 1669 LONGLONG input_buffer_id = 0; |
1659 RETURN_ON_HR_FAILURE(sample->GetSampleTime(&input_buffer_id), | 1670 RETURN_ON_HR_FAILURE(sample->GetSampleTime(&input_buffer_id), |
1660 "Failed to get input buffer id associated with sample", | 1671 "Failed to get input buffer id associated with sample", |
1661 false); | 1672 false); |
1662 | 1673 |
1663 { | 1674 { |
1664 base::AutoLock lock(decoder_lock_); | 1675 base::AutoLock lock(decoder_lock_); |
1665 DCHECK(pending_output_samples_.empty()); | 1676 DCHECK(pending_output_samples_.empty()); |
1666 pending_output_samples_.push_back( | 1677 pending_output_samples_.push_back( |
1667 PendingSampleInfo(input_buffer_id, sample)); | 1678 PendingSampleInfo(input_buffer_id, sample, color_space)); |
1668 } | 1679 } |
1669 | 1680 |
1670 if (pictures_requested_) { | 1681 if (pictures_requested_) { |
1671 DVLOG(1) << "Waiting for picture slots from the client."; | 1682 DVLOG(1) << "Waiting for picture slots from the client."; |
1672 main_thread_task_runner_->PostTask( | 1683 main_thread_task_runner_->PostTask( |
1673 FROM_HERE, | 1684 FROM_HERE, |
1674 base::Bind(&DXVAVideoDecodeAccelerator::ProcessPendingSamples, | 1685 base::Bind(&DXVAVideoDecodeAccelerator::ProcessPendingSamples, |
1675 weak_this_factory_.GetWeakPtr())); | 1686 weak_this_factory_.GetWeakPtr())); |
1676 return true; | 1687 return true; |
1677 } | 1688 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1728 } | 1739 } |
1729 | 1740 |
1730 if (width != index->second->size().width() || | 1741 if (width != index->second->size().width() || |
1731 height != index->second->size().height()) { | 1742 height != index->second->size().height()) { |
1732 HandleResolutionChanged(width, height); | 1743 HandleResolutionChanged(width, height); |
1733 return; | 1744 return; |
1734 } | 1745 } |
1735 | 1746 |
1736 pending_sample->picture_buffer_id = index->second->id(); | 1747 pending_sample->picture_buffer_id = index->second->id(); |
1737 index->second->set_bound(); | 1748 index->second->set_bound(); |
1749 index->second->set_color_space(pending_sample->color_space); | |
1738 if (share_nv12_textures_) { | 1750 if (share_nv12_textures_) { |
1739 main_thread_task_runner_->PostTask( | 1751 main_thread_task_runner_->PostTask( |
1740 FROM_HERE, | 1752 FROM_HERE, |
1741 base::Bind(&DXVAVideoDecodeAccelerator::BindPictureBufferToSample, | 1753 base::Bind(&DXVAVideoDecodeAccelerator::BindPictureBufferToSample, |
1742 weak_this_factory_.GetWeakPtr(), | 1754 weak_this_factory_.GetWeakPtr(), |
1743 pending_sample->output_sample, | 1755 pending_sample->output_sample, |
1744 pending_sample->picture_buffer_id, | 1756 pending_sample->picture_buffer_id, |
1745 pending_sample->input_buffer_id)); | 1757 pending_sample->input_buffer_id)); |
1746 continue; | 1758 continue; |
1747 } | 1759 } |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1881 // they need to be GL_TEXTURE_EXTERNAL_OES. | 1893 // they need to be GL_TEXTURE_EXTERNAL_OES. |
1882 bool provide_nv12_textures = share_nv12_textures_ || copy_nv12_textures_; | 1894 bool provide_nv12_textures = share_nv12_textures_ || copy_nv12_textures_; |
1883 client_->ProvidePictureBuffers( | 1895 client_->ProvidePictureBuffers( |
1884 kNumPictureBuffers, | 1896 kNumPictureBuffers, |
1885 provide_nv12_textures ? PIXEL_FORMAT_NV12 : PIXEL_FORMAT_UNKNOWN, | 1897 provide_nv12_textures ? PIXEL_FORMAT_NV12 : PIXEL_FORMAT_UNKNOWN, |
1886 provide_nv12_textures ? 2 : 1, gfx::Size(width, height), | 1898 provide_nv12_textures ? 2 : 1, gfx::Size(width, height), |
1887 provide_nv12_textures ? GL_TEXTURE_EXTERNAL_OES : GL_TEXTURE_2D); | 1899 provide_nv12_textures ? GL_TEXTURE_EXTERNAL_OES : GL_TEXTURE_2D); |
1888 } | 1900 } |
1889 } | 1901 } |
1890 | 1902 |
1891 void DXVAVideoDecodeAccelerator::NotifyPictureReady(int picture_buffer_id, | 1903 void DXVAVideoDecodeAccelerator::NotifyPictureReady( |
1892 int input_buffer_id) { | 1904 int picture_buffer_id, |
1905 int input_buffer_id, | |
1906 const gfx::ColorSpace& color_space) { | |
1893 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); | 1907 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); |
1894 // This task could execute after the decoder has been torn down. | 1908 // This task could execute after the decoder has been torn down. |
1895 if (GetState() != kUninitialized && client_) { | 1909 if (GetState() != kUninitialized && client_) { |
1896 // TODO(henryhsu): Use correct visible size instead of (0, 0). We can't use | 1910 // TODO(henryhsu): Use correct visible size instead of (0, 0). We can't use |
1897 // coded size here so use (0, 0) intentionally to have the client choose. | 1911 // coded size here so use (0, 0) intentionally to have the client choose. |
1898 Picture picture(picture_buffer_id, input_buffer_id, gfx::Rect(0, 0), false); | 1912 Picture picture(picture_buffer_id, input_buffer_id, gfx::Rect(0, 0), |
1913 color_space, false); | |
1899 client_->PictureReady(picture); | 1914 client_->PictureReady(picture); |
1900 } | 1915 } |
1901 } | 1916 } |
1902 | 1917 |
1903 void DXVAVideoDecodeAccelerator::NotifyInputBuffersDropped() { | 1918 void DXVAVideoDecodeAccelerator::NotifyInputBuffersDropped() { |
1904 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); | 1919 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); |
1905 if (!client_) | 1920 if (!client_) |
1906 return; | 1921 return; |
1907 | 1922 |
1908 for (PendingInputs::iterator it = pending_input_buffers_.begin(); | 1923 for (PendingInputs::iterator it = pending_input_buffers_.begin(); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1967 RETURN_AND_NOTIFY_ON_FAILURE(SendMFTMessage(MFT_MESSAGE_COMMAND_DRAIN, 0), | 1982 RETURN_AND_NOTIFY_ON_FAILURE(SendMFTMessage(MFT_MESSAGE_COMMAND_DRAIN, 0), |
1968 "Failed to send drain message", | 1983 "Failed to send drain message", |
1969 PLATFORM_FAILURE, ); | 1984 PLATFORM_FAILURE, ); |
1970 sent_drain_message_ = true; | 1985 sent_drain_message_ = true; |
1971 } | 1986 } |
1972 } | 1987 } |
1973 | 1988 |
1974 // Attempt to retrieve an output frame from the decoder. If we have one, | 1989 // Attempt to retrieve an output frame from the decoder. If we have one, |
1975 // return and proceed when the output frame is processed. If we don't have a | 1990 // return and proceed when the output frame is processed. If we don't have a |
1976 // frame then we are done. | 1991 // frame then we are done. |
1977 DoDecode(); | 1992 DoDecode(config_change_detector_->current_color_space()); |
1978 if (OutputSamplesPresent()) | 1993 if (OutputSamplesPresent()) |
1979 return; | 1994 return; |
1980 | 1995 |
1981 if (!processing_config_changed_) { | 1996 if (!processing_config_changed_) { |
1982 SetState(kFlushing); | 1997 SetState(kFlushing); |
1983 | 1998 |
1984 main_thread_task_runner_->PostTask( | 1999 main_thread_task_runner_->PostTask( |
1985 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::NotifyFlushDone, | 2000 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::NotifyFlushDone, |
1986 weak_this_factory_.GetWeakPtr())); | 2001 weak_this_factory_.GetWeakPtr())); |
1987 } else { | 2002 } else { |
(...skipping 28 matching lines...) Expand all Loading... | |
2016 PLATFORM_FAILURE, ); | 2031 PLATFORM_FAILURE, ); |
2017 | 2032 |
2018 processing_config_changed_ = config_changed; | 2033 processing_config_changed_ = config_changed; |
2019 | 2034 |
2020 if (config_changed) { | 2035 if (config_changed) { |
2021 pending_input_buffers_.push_back(sample); | 2036 pending_input_buffers_.push_back(sample); |
2022 FlushInternal(); | 2037 FlushInternal(); |
2023 return; | 2038 return; |
2024 } | 2039 } |
2025 | 2040 |
2041 gfx::ColorSpace color_space = config_change_detector_->current_color_space(); | |
2042 | |
2026 if (!inputs_before_decode_) { | 2043 if (!inputs_before_decode_) { |
2027 TRACE_EVENT_ASYNC_BEGIN0("gpu", "DXVAVideoDecodeAccelerator.Decoding", | 2044 TRACE_EVENT_ASYNC_BEGIN0("gpu", "DXVAVideoDecodeAccelerator.Decoding", |
2028 this); | 2045 this); |
2029 } | 2046 } |
2030 inputs_before_decode_++; | 2047 inputs_before_decode_++; |
2031 | 2048 |
2032 hr = decoder_->ProcessInput(0, sample.get(), 0); | 2049 hr = decoder_->ProcessInput(0, sample.get(), 0); |
2033 // As per msdn if the decoder returns MF_E_NOTACCEPTING then it means that it | 2050 // As per msdn if the decoder returns MF_E_NOTACCEPTING then it means that it |
2034 // has enough data to produce one or more output samples. In this case the | 2051 // has enough data to produce one or more output samples. In this case the |
2035 // recommended options are to | 2052 // recommended options are to |
2036 // 1. Generate new output by calling IMFTransform::ProcessOutput until it | 2053 // 1. Generate new output by calling IMFTransform::ProcessOutput until it |
2037 // returns MF_E_TRANSFORM_NEED_MORE_INPUT. | 2054 // returns MF_E_TRANSFORM_NEED_MORE_INPUT. |
2038 // 2. Flush the input data | 2055 // 2. Flush the input data |
2039 // We implement the first option, i.e to retrieve the output sample and then | 2056 // We implement the first option, i.e to retrieve the output sample and then |
2040 // process the input again. Failure in either of these steps is treated as a | 2057 // process the input again. Failure in either of these steps is treated as a |
2041 // decoder failure. | 2058 // decoder failure. |
2042 if (hr == MF_E_NOTACCEPTING) { | 2059 if (hr == MF_E_NOTACCEPTING) { |
2043 DoDecode(); | 2060 DoDecode(color_space); |
2044 // If the DoDecode call resulted in an output frame then we should not | 2061 // If the DoDecode call resulted in an output frame then we should not |
2045 // process any more input until that frame is copied to the target surface. | 2062 // process any more input until that frame is copied to the target surface. |
2046 if (!OutputSamplesPresent()) { | 2063 if (!OutputSamplesPresent()) { |
2047 State state = GetState(); | 2064 State state = GetState(); |
2048 RETURN_AND_NOTIFY_ON_FAILURE( | 2065 RETURN_AND_NOTIFY_ON_FAILURE( |
2049 (state == kStopped || state == kNormal || state == kFlushing), | 2066 (state == kStopped || state == kNormal || state == kFlushing), |
2050 "Failed to process output. Unexpected decoder state: " << state, | 2067 "Failed to process output. Unexpected decoder state: " << state, |
2051 PLATFORM_FAILURE, ); | 2068 PLATFORM_FAILURE, ); |
2052 hr = decoder_->ProcessInput(0, sample.get(), 0); | 2069 hr = decoder_->ProcessInput(0, sample.get(), 0); |
2053 } | 2070 } |
(...skipping 11 matching lines...) Expand all Loading... | |
2065 decoder_thread_task_runner_->PostTask( | 2082 decoder_thread_task_runner_->PostTask( |
2066 FROM_HERE, | 2083 FROM_HERE, |
2067 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, | 2084 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, |
2068 base::Unretained(this))); | 2085 base::Unretained(this))); |
2069 return; | 2086 return; |
2070 } | 2087 } |
2071 } | 2088 } |
2072 RETURN_AND_NOTIFY_ON_HR_FAILURE(hr, "Failed to process input sample", | 2089 RETURN_AND_NOTIFY_ON_HR_FAILURE(hr, "Failed to process input sample", |
2073 PLATFORM_FAILURE, ); | 2090 PLATFORM_FAILURE, ); |
2074 | 2091 |
2075 DoDecode(); | 2092 DoDecode(color_space); |
2076 | 2093 |
2077 State state = GetState(); | 2094 State state = GetState(); |
2078 RETURN_AND_NOTIFY_ON_FAILURE( | 2095 RETURN_AND_NOTIFY_ON_FAILURE( |
2079 (state == kStopped || state == kNormal || state == kFlushing), | 2096 (state == kStopped || state == kNormal || state == kFlushing), |
2080 "Failed to process output. Unexpected decoder state: " << state, | 2097 "Failed to process output. Unexpected decoder state: " << state, |
2081 ILLEGAL_STATE, ); | 2098 ILLEGAL_STATE, ); |
2082 | 2099 |
2083 LONGLONG input_buffer_id = 0; | 2100 LONGLONG input_buffer_id = 0; |
2084 RETURN_ON_HR_FAILURE( | 2101 RETURN_ON_HR_FAILURE( |
2085 sample->GetSampleTime(&input_buffer_id), | 2102 sample->GetSampleTime(&input_buffer_id), |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2246 RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_cb_.Run(), | 2263 RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_cb_.Run(), |
2247 "Failed to make context current", | 2264 "Failed to make context current", |
2248 PLATFORM_FAILURE, ); | 2265 PLATFORM_FAILURE, ); |
2249 | 2266 |
2250 DCHECK(!output_picture_buffers_.empty()); | 2267 DCHECK(!output_picture_buffers_.empty()); |
2251 | 2268 |
2252 bool result = picture_buffer->CopySurfaceComplete(src_surface, dest_surface); | 2269 bool result = picture_buffer->CopySurfaceComplete(src_surface, dest_surface); |
2253 RETURN_AND_NOTIFY_ON_FAILURE(result, "Failed to complete copying surface", | 2270 RETURN_AND_NOTIFY_ON_FAILURE(result, "Failed to complete copying surface", |
2254 PLATFORM_FAILURE, ); | 2271 PLATFORM_FAILURE, ); |
2255 | 2272 |
2256 NotifyPictureReady(picture_buffer->id(), input_buffer_id); | 2273 NotifyPictureReady(picture_buffer->id(), input_buffer_id, gfx::ColorSpace()); |
2257 | 2274 |
2258 { | 2275 { |
2259 base::AutoLock lock(decoder_lock_); | 2276 base::AutoLock lock(decoder_lock_); |
2260 if (!pending_output_samples_.empty()) | 2277 if (!pending_output_samples_.empty()) |
2261 pending_output_samples_.pop_front(); | 2278 pending_output_samples_.pop_front(); |
2262 } | 2279 } |
2263 | 2280 |
2264 if (pending_flush_ || processing_config_changed_) { | 2281 if (pending_flush_ || processing_config_changed_) { |
2265 decoder_thread_task_runner_->PostTask( | 2282 decoder_thread_task_runner_->PostTask( |
2266 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal, | 2283 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2298 RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_cb_.Run(), | 2315 RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_cb_.Run(), |
2299 "Failed to make context current", | 2316 "Failed to make context current", |
2300 PLATFORM_FAILURE, ); | 2317 PLATFORM_FAILURE, ); |
2301 | 2318 |
2302 DCHECK(!output_picture_buffers_.empty()); | 2319 DCHECK(!output_picture_buffers_.empty()); |
2303 | 2320 |
2304 bool result = picture_buffer->BindSampleToTexture(sample); | 2321 bool result = picture_buffer->BindSampleToTexture(sample); |
2305 RETURN_AND_NOTIFY_ON_FAILURE(result, "Failed to complete copying surface", | 2322 RETURN_AND_NOTIFY_ON_FAILURE(result, "Failed to complete copying surface", |
2306 PLATFORM_FAILURE, ); | 2323 PLATFORM_FAILURE, ); |
2307 | 2324 |
2308 NotifyPictureReady(picture_buffer->id(), input_buffer_id); | 2325 NotifyPictureReady(picture_buffer->id(), input_buffer_id, |
2326 picture_buffer->color_space()); | |
2309 | 2327 |
2310 { | 2328 { |
2311 base::AutoLock lock(decoder_lock_); | 2329 base::AutoLock lock(decoder_lock_); |
2312 if (!pending_output_samples_.empty()) | 2330 if (!pending_output_samples_.empty()) |
2313 pending_output_samples_.pop_front(); | 2331 pending_output_samples_.pop_front(); |
2314 } | 2332 } |
2315 | 2333 |
2316 if (pending_flush_ || processing_config_changed_) { | 2334 if (pending_flush_ || processing_config_changed_) { |
2317 decoder_thread_task_runner_->PostTask( | 2335 decoder_thread_task_runner_->PostTask( |
2318 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal, | 2336 FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal, |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2685 SetState(kConfigChange); | 2703 SetState(kConfigChange); |
2686 Invalidate(); | 2704 Invalidate(); |
2687 Initialize(config_, client_); | 2705 Initialize(config_, client_); |
2688 decoder_thread_task_runner_->PostTask( | 2706 decoder_thread_task_runner_->PostTask( |
2689 FROM_HERE, | 2707 FROM_HERE, |
2690 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, | 2708 base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, |
2691 base::Unretained(this))); | 2709 base::Unretained(this))); |
2692 } | 2710 } |
2693 | 2711 |
2694 } // namespace media | 2712 } // namespace media |
OLD | NEW |