| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 * | 9 * |
| 10 */ | 10 */ |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 decode_params->callback->Decoded(decoded_frame); | 99 decode_params->callback->Decoded(decoded_frame); |
| 100 } | 100 } |
| 101 | 101 |
| 102 } // namespace internal | 102 } // namespace internal |
| 103 | 103 |
| 104 namespace webrtc { | 104 namespace webrtc { |
| 105 | 105 |
| 106 H264VideoToolboxDecoder::H264VideoToolboxDecoder() | 106 H264VideoToolboxDecoder::H264VideoToolboxDecoder() |
| 107 : callback_(nullptr), | 107 : callback_(nullptr), |
| 108 video_format_(nullptr), | 108 video_format_(nullptr), |
| 109 decompression_session_(nullptr) { | 109 decompression_session_(nullptr) {} |
| 110 } | |
| 111 | 110 |
| 112 H264VideoToolboxDecoder::~H264VideoToolboxDecoder() { | 111 H264VideoToolboxDecoder::~H264VideoToolboxDecoder() { |
| 113 DestroyDecompressionSession(); | 112 DestroyDecompressionSession(); |
| 114 SetVideoFormat(nullptr); | 113 SetVideoFormat(nullptr); |
| 115 } | 114 } |
| 116 | 115 |
| 117 int H264VideoToolboxDecoder::InitDecode(const VideoCodec* video_codec, | 116 int H264VideoToolboxDecoder::InitDecode(const VideoCodec* video_codec, |
| 118 int number_of_cores) { | 117 int number_of_cores) { |
| 119 return WEBRTC_VIDEO_CODEC_OK; | 118 return WEBRTC_VIDEO_CODEC_OK; |
| 120 } | 119 } |
| 121 | 120 |
| 122 int H264VideoToolboxDecoder::Decode( | 121 int H264VideoToolboxDecoder::Decode( |
| 123 const EncodedImage& input_image, | 122 const EncodedImage& input_image, |
| 124 bool missing_frames, | 123 bool missing_frames, |
| 125 const RTPFragmentationHeader* fragmentation, | 124 const RTPFragmentationHeader* fragmentation, |
| 126 const CodecSpecificInfo* codec_specific_info, | 125 const CodecSpecificInfo* codec_specific_info, |
| 127 int64_t render_time_ms) { | 126 int64_t render_time_ms) { |
| 128 RTC_DCHECK(input_image._buffer); | 127 RTC_DCHECK(input_image._buffer); |
| 129 | 128 |
| 130 CMSampleBufferRef sample_buffer = nullptr; | 129 CMSampleBufferRef sample_buffer = nullptr; |
| 131 if (!H264AnnexBBufferToCMSampleBuffer(input_image._buffer, | 130 if (!H264AnnexBBufferToCMSampleBuffer(input_image._buffer, |
| 132 input_image._length, | 131 input_image._length, video_format_, |
| 133 video_format_, | |
| 134 &sample_buffer)) { | 132 &sample_buffer)) { |
| 135 return WEBRTC_VIDEO_CODEC_ERROR; | 133 return WEBRTC_VIDEO_CODEC_ERROR; |
| 136 } | 134 } |
| 137 RTC_DCHECK(sample_buffer); | 135 RTC_DCHECK(sample_buffer); |
| 138 // Check if the video format has changed, and reinitialize decoder if needed. | 136 // Check if the video format has changed, and reinitialize decoder if needed. |
| 139 CMVideoFormatDescriptionRef description = | 137 CMVideoFormatDescriptionRef description = |
| 140 CMSampleBufferGetFormatDescription(sample_buffer); | 138 CMSampleBufferGetFormatDescription(sample_buffer); |
| 141 if (!CMFormatDescriptionEqual(description, video_format_)) { | 139 if (!CMFormatDescriptionEqual(description, video_format_)) { |
| 142 SetVideoFormat(description); | 140 SetVideoFormat(description); |
| 143 ResetDecompressionSession(); | 141 ResetDecompressionSession(); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 kCVPixelBufferOpenGLCompatibilityKey, | 197 kCVPixelBufferOpenGLCompatibilityKey, |
| 200 #endif | 198 #endif |
| 201 kCVPixelBufferIOSurfacePropertiesKey, | 199 kCVPixelBufferIOSurfacePropertiesKey, |
| 202 kCVPixelBufferPixelFormatTypeKey | 200 kCVPixelBufferPixelFormatTypeKey |
| 203 }; | 201 }; |
| 204 CFDictionaryRef io_surface_value = | 202 CFDictionaryRef io_surface_value = |
| 205 internal::CreateCFDictionary(nullptr, nullptr, 0); | 203 internal::CreateCFDictionary(nullptr, nullptr, 0); |
| 206 int64_t nv12type = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange; | 204 int64_t nv12type = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange; |
| 207 CFNumberRef pixel_format = | 205 CFNumberRef pixel_format = |
| 208 CFNumberCreate(nullptr, kCFNumberLongType, &nv12type); | 206 CFNumberCreate(nullptr, kCFNumberLongType, &nv12type); |
| 209 CFTypeRef values[attributes_size] = { | 207 CFTypeRef values[attributes_size] = {kCFBooleanTrue, io_surface_value, |
| 210 kCFBooleanTrue, | 208 pixel_format}; |
| 211 io_surface_value, | |
| 212 pixel_format | |
| 213 }; | |
| 214 CFDictionaryRef attributes = | 209 CFDictionaryRef attributes = |
| 215 internal::CreateCFDictionary(keys, values, attributes_size); | 210 internal::CreateCFDictionary(keys, values, attributes_size); |
| 216 if (io_surface_value) { | 211 if (io_surface_value) { |
| 217 CFRelease(io_surface_value); | 212 CFRelease(io_surface_value); |
| 218 io_surface_value = nullptr; | 213 io_surface_value = nullptr; |
| 219 } | 214 } |
| 220 if (pixel_format) { | 215 if (pixel_format) { |
| 221 CFRelease(pixel_format); | 216 CFRelease(pixel_format); |
| 222 pixel_format = nullptr; | 217 pixel_format = nullptr; |
| 223 } | 218 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 } | 261 } |
| 267 } | 262 } |
| 268 | 263 |
| 269 const char* H264VideoToolboxDecoder::ImplementationName() const { | 264 const char* H264VideoToolboxDecoder::ImplementationName() const { |
| 270 return "VideoToolbox"; | 265 return "VideoToolbox"; |
| 271 } | 266 } |
| 272 | 267 |
| 273 } // namespace webrtc | 268 } // namespace webrtc |
| 274 | 269 |
| 275 #endif // defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) | 270 #endif // defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) |
| OLD | NEW |