| 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 "content/common/gpu/media/mac_video_decode_accelerator.h" | 5 #include "content/common/gpu/media/mac_video_decode_accelerator.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
| 9 #import "base/mac/foundation_util.h" | 9 #import "base/mac/foundation_util.h" |
| 10 #import "base/memory/ref_counted_memory.h" | 10 #import "base/memory/ref_counted_memory.h" |
| 11 #import "base/message_loop.h" | 11 #import "base/message_loop.h" |
| 12 #include "base/location.h" | 12 #include "base/location.h" |
| 13 #include "base/native_library.h" | 13 #include "base/native_library.h" |
| 14 #include "ui/surface/io_surface_support_mac.h" | 14 #include "ui/surface/io_surface_support_mac.h" |
| 15 #include "ui/gfx/video_decode_acceleration_support_mac.h" | 15 #include "ui/gfx/video_decode_acceleration_support_mac.h" |
| 16 | 16 |
| 17 namespace content { |
| 18 |
| 17 // Helper macros for dealing with failure. If |result| evaluates false, emit | 19 // Helper macros for dealing with failure. If |result| evaluates false, emit |
| 18 // |log| to ERROR, register |error| with the decoder, and return |ret_val| | 20 // |log| to ERROR, register |error| with the decoder, and return |ret_val| |
| 19 // (which may be omitted for functions that return void). | 21 // (which may be omitted for functions that return void). |
| 20 #define RETURN_ON_FAILURE(result, log, error, ret_val) \ | 22 #define RETURN_ON_FAILURE(result, log, error, ret_val) \ |
| 21 do { \ | 23 do { \ |
| 22 if (!(result)) { \ | 24 if (!(result)) { \ |
| 23 DLOG(ERROR) << log; \ | 25 DLOG(ERROR) << log; \ |
| 24 StopOnError(error); \ | 26 StopOnError(error); \ |
| 25 return ret_val; \ | 27 return ret_val; \ |
| 26 } \ | 28 } \ |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 RETURN_ON_FAILURE(client_, | 122 RETURN_ON_FAILURE(client_, |
| 121 "Call to Decode() during invalid state.", ILLEGAL_STATE,); | 123 "Call to Decode() during invalid state.", ILLEGAL_STATE,); |
| 122 | 124 |
| 123 base::SharedMemory memory(bitstream_buffer.handle(), true); | 125 base::SharedMemory memory(bitstream_buffer.handle(), true); |
| 124 RETURN_ON_FAILURE(memory.Map(bitstream_buffer.size()), | 126 RETURN_ON_FAILURE(memory.Map(bitstream_buffer.size()), |
| 125 "Failed to SharedMemory::Map().", UNREADABLE_INPUT,); | 127 "Failed to SharedMemory::Map().", UNREADABLE_INPUT,); |
| 126 | 128 |
| 127 h264_parser_.SetStream(static_cast<const uint8_t*>(memory.memory()), | 129 h264_parser_.SetStream(static_cast<const uint8_t*>(memory.memory()), |
| 128 bitstream_buffer.size()); | 130 bitstream_buffer.size()); |
| 129 while (true) { | 131 while (true) { |
| 130 content::H264NALU nalu; | 132 H264NALU nalu; |
| 131 content::H264Parser::Result result = h264_parser_.AdvanceToNextNALU(&nalu); | 133 H264Parser::Result result = h264_parser_.AdvanceToNextNALU(&nalu); |
| 132 if (result == content::H264Parser::kEOStream) { | 134 if (result == H264Parser::kEOStream) { |
| 133 if (bitstream_nalu_count_.count(bitstream_buffer.id()) == 0) { | 135 if (bitstream_nalu_count_.count(bitstream_buffer.id()) == 0) { |
| 134 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 136 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 135 &MacVideoDecodeAccelerator::NotifyInputBufferRead, | 137 &MacVideoDecodeAccelerator::NotifyInputBufferRead, |
| 136 base::AsWeakPtr(this), bitstream_buffer.id())); | 138 base::AsWeakPtr(this), bitstream_buffer.id())); |
| 137 } | 139 } |
| 138 return; | 140 return; |
| 139 } | 141 } |
| 140 RETURN_ON_FAILURE(result == content::H264Parser::kOk, | 142 RETURN_ON_FAILURE(result == H264Parser::kOk, |
| 141 "Unable to parse bitstream.", UNREADABLE_INPUT,); | 143 "Unable to parse bitstream.", UNREADABLE_INPUT,); |
| 142 if (!did_build_config_record_) { | 144 if (!did_build_config_record_) { |
| 143 std::vector<uint8_t> config_record; | 145 std::vector<uint8_t> config_record; |
| 144 RETURN_ON_FAILURE(config_record_builder_.ProcessNALU(&h264_parser_, nalu, | 146 RETURN_ON_FAILURE(config_record_builder_.ProcessNALU(&h264_parser_, nalu, |
| 145 &config_record), | 147 &config_record), |
| 146 "Unable to build AVC configuraiton record.", | 148 "Unable to build AVC configuraiton record.", |
| 147 UNREADABLE_INPUT,); | 149 UNREADABLE_INPUT,); |
| 148 if (!config_record.empty()) { | 150 if (!config_record.empty()) { |
| 149 did_build_config_record_ = true; | 151 did_build_config_record_ = true; |
| 150 if (!CreateDecoder(config_record)) | 152 if (!CreateDecoder(config_record)) |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 &extra_data[0], extra_data.size()); | 303 &extra_data[0], extra_data.size()); |
| 302 RETURN_ON_FAILURE(status == gfx::VideoDecodeAccelerationSupport::SUCCESS, | 304 RETURN_ON_FAILURE(status == gfx::VideoDecodeAccelerationSupport::SUCCESS, |
| 303 "Creating video decoder failed with error: " << status, | 305 "Creating video decoder failed with error: " << status, |
| 304 PLATFORM_FAILURE, false); | 306 PLATFORM_FAILURE, false); |
| 305 | 307 |
| 306 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 308 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 307 &MacVideoDecodeAccelerator::RequestPictures, base::AsWeakPtr(this))); | 309 &MacVideoDecodeAccelerator::RequestPictures, base::AsWeakPtr(this))); |
| 308 return true; | 310 return true; |
| 309 } | 311 } |
| 310 | 312 |
| 311 void MacVideoDecodeAccelerator::DecodeNALU(const content::H264NALU& nalu, | 313 void MacVideoDecodeAccelerator::DecodeNALU(const H264NALU& nalu, |
| 312 int32 bitstream_buffer_id) { | 314 int32 bitstream_buffer_id) { |
| 313 // Assume the NALU length field size is 4 bytes. | 315 // Assume the NALU length field size is 4 bytes. |
| 314 const int kNALULengthFieldSize = 4; | 316 const int kNALULengthFieldSize = 4; |
| 315 std::vector<uint8_t> data(kNALULengthFieldSize + nalu.size); | 317 std::vector<uint8_t> data(kNALULengthFieldSize + nalu.size); |
| 316 | 318 |
| 317 // Store the buffer size at the beginning of the buffer as the decoder | 319 // Store the buffer size at the beginning of the buffer as the decoder |
| 318 // expects. | 320 // expects. |
| 319 for (size_t i = 0; i < kNALULengthFieldSize; ++i) { | 321 for (size_t i = 0; i < kNALULengthFieldSize; ++i) { |
| 320 size_t shift = kNALULengthFieldSize * 8 - (i + 1) * 8; | 322 size_t shift = kNALULengthFieldSize * 8 - (i + 1) * 8; |
| 321 data[i] = (nalu.size >> shift) & 0xff; | 323 data[i] = (nalu.size >> shift) & 0xff; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 } | 373 } |
| 372 | 374 |
| 373 MacVideoDecodeAccelerator::UsedPictureInfo::~UsedPictureInfo() { | 375 MacVideoDecodeAccelerator::UsedPictureInfo::~UsedPictureInfo() { |
| 374 } | 376 } |
| 375 | 377 |
| 376 MacVideoDecodeAccelerator::DecodedImageInfo::DecodedImageInfo() { | 378 MacVideoDecodeAccelerator::DecodedImageInfo::DecodedImageInfo() { |
| 377 } | 379 } |
| 378 | 380 |
| 379 MacVideoDecodeAccelerator::DecodedImageInfo::~DecodedImageInfo() { | 381 MacVideoDecodeAccelerator::DecodedImageInfo::~DecodedImageInfo() { |
| 380 } | 382 } |
| 383 |
| 384 } // namespace content |
| OLD | NEW |