Index: ui/gfx/video_decode_acceleration_support_mac.mm |
diff --git a/ui/gfx/video_decode_acceleration_support_mac.mm b/ui/gfx/video_decode_acceleration_support_mac.mm |
deleted file mode 100644 |
index 4cc2045ed7ad940667c8d774602f63ae8e707168..0000000000000000000000000000000000000000 |
--- a/ui/gfx/video_decode_acceleration_support_mac.mm |
+++ /dev/null |
@@ -1,224 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "ui/gfx/video_decode_acceleration_support_mac.h" |
- |
-#include <dlfcn.h> |
- |
-#include "base/bind.h" |
-#include "base/files/file_path.h" |
-#include "base/location.h" |
-#import "base/mac/foundation_util.h" |
-#include "base/mac/scoped_nsautorelease_pool.h" |
-#include "base/native_library.h" |
- |
-using base::mac::CFToNSCast; |
-using base::mac::NSToCFCast; |
- |
-const CFStringRef kVDADecoderConfiguration_Width = CFSTR("width"); |
-const CFStringRef kVDADecoderConfiguration_Height = CFSTR("height"); |
-const CFStringRef kVDADecoderConfiguration_SourceFormat = CFSTR("format"); |
-const CFStringRef kVDADecoderConfiguration_avcCData = CFSTR("avcC"); |
-const CFStringRef kCVPixelBufferIOSurfacePropertiesKey = |
- CFSTR("IOSurfaceProperties"); |
- |
-namespace { |
- |
-// These are 10.6.3 APIs that we look up at run time. |
-typedef OSStatus (*VDADecoderCreateFunc)( |
- CFDictionaryRef decoderConfiguration, |
- CFDictionaryRef destinationImageBufferAttributes, |
- VDADecoderOutputCallback* outputCallback, |
- void* decoderOutputCallbackRefcon, |
- VDADecoder* decoderOut); |
- |
-typedef OSStatus (*VDADecoderDecodeFunc)( |
- VDADecoder decoder, |
- uint32_t decodeFlags, |
- CFTypeRef compressedBuffer, |
- CFDictionaryRef frameInfo); |
- |
-typedef OSStatus (*VDADecoderFlushFunc)( |
- VDADecoder decoder, |
- uint32_t flushFlags); |
- |
-typedef OSStatus (*VDADecoderDestroyFunc)( |
- VDADecoder decoder); |
- |
-VDADecoderCreateFunc g_VDADecoderCreate; |
-VDADecoderDecodeFunc g_VDADecoderDecode; |
-VDADecoderFlushFunc g_VDADecoderFlush; |
-VDADecoderDestroyFunc g_VDADecoderDestroy; |
- |
-NSString* const kFrameIdKey = @"frame_id"; |
- |
-bool InitializeVdaApis() { |
- static bool should_initialize = true; |
- if (should_initialize) { |
- should_initialize = false; |
- base::FilePath path; |
- if (!base::mac::GetSearchPathDirectory( |
- NSLibraryDirectory, NSSystemDomainMask, &path)) { |
- return false; |
- } |
- |
- path = path.AppendASCII("Frameworks") |
- .AppendASCII("VideoDecodeAcceleration.framework") |
- .AppendASCII("VideoDecodeAcceleration"); |
- base::NativeLibrary vda_library = base::LoadNativeLibrary(path, NULL); |
- if (!vda_library) |
- return false; |
- |
- g_VDADecoderCreate = reinterpret_cast<VDADecoderCreateFunc>( |
- base::GetFunctionPointerFromNativeLibrary( |
- vda_library, "VDADecoderCreate")); |
- g_VDADecoderDecode = reinterpret_cast<VDADecoderDecodeFunc>( |
- base::GetFunctionPointerFromNativeLibrary( |
- vda_library, "VDADecoderDecode")); |
- g_VDADecoderFlush = reinterpret_cast<VDADecoderFlushFunc>( |
- base::GetFunctionPointerFromNativeLibrary( |
- vda_library, "VDADecoderFlush")); |
- g_VDADecoderDestroy = reinterpret_cast<VDADecoderDestroyFunc>( |
- base::GetFunctionPointerFromNativeLibrary( |
- vda_library, "VDADecoderDestroy")); |
- } |
- |
- return g_VDADecoderCreate && g_VDADecoderDecode && g_VDADecoderFlush && |
- g_VDADecoderDestroy; |
-} |
- |
-} // namespace |
- |
-namespace gfx { |
- |
-VideoDecodeAccelerationSupport::VideoDecodeAccelerationSupport() |
- : decoder_(NULL), |
- frame_id_count_(0), |
- loop_(base::MessageLoopProxy::current()) { |
-} |
- |
-VideoDecodeAccelerationSupport::Status VideoDecodeAccelerationSupport::Create( |
- int width, |
- int height, |
- int pixel_format, |
- const void* avc_bytes, |
- size_t avc_size) { |
- if (!InitializeVdaApis()) |
- return LOAD_FRAMEWORK_ERROR; |
- |
- NSData* avc_data = [NSData dataWithBytes:avc_bytes length:avc_size]; |
- NSDictionary* config = [NSDictionary dictionaryWithObjectsAndKeys: |
- [NSNumber numberWithInt:width], |
- CFToNSCast(kVDADecoderConfiguration_Width), |
- [NSNumber numberWithInt:height], |
- CFToNSCast(kVDADecoderConfiguration_Height), |
- [NSNumber numberWithInt:'avc1'], |
- CFToNSCast(kVDADecoderConfiguration_SourceFormat), |
- avc_data, |
- CFToNSCast(kVDADecoderConfiguration_avcCData), |
- nil]; |
- |
- NSDictionary* format_info = [NSDictionary dictionaryWithObjectsAndKeys: |
- [NSNumber numberWithInt:pixel_format], |
- CFToNSCast(kCVPixelBufferPixelFormatTypeKey), |
- // Must set to an empty dictionary as per documentation. |
- [NSDictionary dictionary], |
- CFToNSCast(kCVPixelBufferIOSurfacePropertiesKey), |
- nil]; |
- |
- OSStatus status = g_VDADecoderCreate(NSToCFCast(config), |
- NSToCFCast(format_info), |
- reinterpret_cast<VDADecoderOutputCallback*>(OnFrameReadyCallback), this, |
- &decoder_); |
- switch (status) { |
- case kVDADecoderNoErr: |
- return SUCCESS; |
- case kVDADecoderHardwareNotSupportedErr: |
- return HARDWARE_NOT_SUPPORTED_ERROR; |
- default: |
- return OTHER_ERROR; |
- } |
-} |
- |
-VideoDecodeAccelerationSupport::Status VideoDecodeAccelerationSupport::Decode( |
- const void* bytes, |
- size_t size, |
- const FrameReadyCallback& cb) { |
- DCHECK(decoder_); |
- ++frame_id_count_; |
- frame_ready_callbacks_[frame_id_count_] = cb; |
- |
- NSData* data = [NSData dataWithBytes:bytes length:size]; |
- NSDictionary* frame_info = [NSDictionary |
- dictionaryWithObject:[NSNumber numberWithInt:frame_id_count_] |
- forKey:kFrameIdKey]; |
- |
- OSStatus status = g_VDADecoderDecode(decoder_, 0, NSToCFCast(data), |
- NSToCFCast(frame_info)); |
- if (status != kVDADecoderNoErr) { |
- frame_ready_callbacks_.erase(frame_id_count_); |
- return OTHER_ERROR; |
- } |
- return SUCCESS; |
-} |
- |
-VideoDecodeAccelerationSupport::Status VideoDecodeAccelerationSupport::Flush( |
- bool emit_frames) { |
- DCHECK(decoder_); |
- OSStatus status = g_VDADecoderFlush( |
- decoder_, emit_frames ? kVDADecoderFlush_EmitFrames : 0); |
- if (!emit_frames) |
- frame_ready_callbacks_.clear(); |
- return status == kVDADecoderNoErr ? SUCCESS : OTHER_ERROR; |
-} |
- |
-VideoDecodeAccelerationSupport::Status |
-VideoDecodeAccelerationSupport::Destroy() { |
- // Decoder might be NULL if Create() fails. |
- if (!decoder_) |
- return SUCCESS; |
- OSStatus status = g_VDADecoderDestroy(decoder_); |
- decoder_ = NULL; |
- return status == kVDADecoderNoErr ? SUCCESS : OTHER_ERROR; |
-} |
- |
-VideoDecodeAccelerationSupport::~VideoDecodeAccelerationSupport() { |
- DCHECK(!decoder_); |
-} |
- |
-// static |
-void VideoDecodeAccelerationSupport::OnFrameReadyCallback( |
- void* callback_data, |
- CFDictionaryRef frame_info, |
- OSStatus status, |
- uint32_t flags, |
- CVImageBufferRef image_buffer) { |
- base::mac::ScopedNSAutoreleasePool pool; |
- NSNumber* frame_id_num = base::mac::ObjCCastStrict<NSNumber>( |
- [CFToNSCast(frame_info) objectForKey:kFrameIdKey]); |
- int frame_id = [frame_id_num intValue]; |
- |
- // Retain the image while the callback is in flight. |
- if (image_buffer) |
- CFRetain(image_buffer); |
- |
- VideoDecodeAccelerationSupport* vda = |
- reinterpret_cast<VideoDecodeAccelerationSupport*>(callback_data); |
- DCHECK(vda); |
- vda->loop_->PostTask( |
- FROM_HERE, base::Bind(&VideoDecodeAccelerationSupport::OnFrameReady, vda, |
- image_buffer, status, frame_id)); |
-} |
- |
-void VideoDecodeAccelerationSupport::OnFrameReady(CVImageBufferRef image_buffer, |
- OSStatus status, |
- int frame_id) { |
- frame_ready_callbacks_[frame_id].Run(image_buffer, status); |
- // Match the retain in OnFrameReadyCallback. |
- if (image_buffer) |
- CFRelease(image_buffer); |
- frame_ready_callbacks_.erase(frame_id); |
-} |
- |
-} // namespace |