Index: ppapi/cpp/dev/video_decoder_dev.cc |
diff --git a/ppapi/cpp/dev/video_decoder_dev.cc b/ppapi/cpp/dev/video_decoder_dev.cc |
index 504530a29616642ddb08da314695e13f02a0d2cb..54916485acf16916e90758389e27bbb1e4e864fd 100644 |
--- a/ppapi/cpp/dev/video_decoder_dev.cc |
+++ b/ppapi/cpp/dev/video_decoder_dev.cc |
@@ -4,6 +4,8 @@ |
#include "ppapi/cpp/dev/video_decoder_dev.h" |
+#include <algorithm> |
+ |
#include "ppapi/c/dev/ppb_video_decoder_dev.h" |
#include "ppapi/c/dev/ppp_video_decoder_dev.h" |
#include "ppapi/c/pp_errors.h" |
@@ -24,64 +26,118 @@ template <> const char* interface_name<PPB_VideoDecoder_Dev>() { |
} // namespace |
-VideoDecoder::VideoDecoder(const Instance* /* instance */, |
- const std::vector<uint32_t>& /* config */, |
- CompletionCallback /* callback */, |
+VideoDecoder::VideoDecoder(const Instance* instance, |
+ const std::vector<uint32_t>& config, |
+ CompletionCallback callback, |
Client* client) |
: client_(client) { |
if (!has_interface<PPB_VideoDecoder_Dev>()) |
return; |
- // TODO(vmr): Implement. |
+ PP_VideoConfigElement* c_config = new PP_VideoConfigElement[config.size()]; |
+ std::copy(config.begin(), config.end(), c_config); |
brettw
2011/05/31 12:46:44
I don't really understand what you're doing here.
Ville-Mikko Rautio
2011/05/31 13:33:14
Done.
|
+ PassRefFromConstructor(get_interface<PPB_VideoDecoder_Dev>()->Create( |
+ instance->pp_instance(), c_config, callback.pp_completion_callback())); |
+ delete [] c_config; |
brettw
2011/05/31 12:46:44
Normally I think we don't put a space in delete[].
Ville-Mikko Rautio
2011/05/31 13:33:14
Done.
|
} |
VideoDecoder::~VideoDecoder() {} |
vector<uint32_t> VideoDecoder::GetConfigs( |
- Instance* /* instance */, |
- const vector<uint32_t>& /* prototype_config */) { |
- // TODO(vmr): Implement. |
+ Instance* instance, |
+ const vector<uint32_t>& prototype_config) { |
brettw
2011/05/31 12:46:44
You're not very consistent about std:: vs. not. I'
Ville-Mikko Rautio
2011/05/31 13:33:14
Done.
|
vector<uint32_t> matching_configs; |
if (!has_interface<PPB_VideoDecoder_Dev>()) |
return matching_configs; |
+ // Convert prototype config into C-array and ask how many matching configs |
+ // there are. |
+ PP_VideoConfigElement* c_proto = NULL; |
+ if (prototype_config.size() > 0) { |
+ c_proto = new PP_VideoConfigElement[prototype_config.size()]; |
+ if (c_proto == NULL) |
+ return matching_configs; |
+ std::copy(prototype_config.begin(), prototype_config.end(), c_proto); |
brettw
2011/05/31 12:46:44
Is this copy necessary? Why not just pass &prototy
Ville-Mikko Rautio
2011/05/31 13:33:14
I changed this as well. From now on, we are absolu
|
+ } |
+ uint32_t num_of_matching_configs = 0; |
+ get_interface<PPB_VideoDecoder_Dev>()->GetConfigs( |
+ instance->pp_instance(), c_proto, NULL, 0, &num_of_matching_configs); |
+ if (num_of_matching_configs == 0) { |
+ delete[] c_proto; |
+ return matching_configs; |
+ } |
+ // Then ask the actually matching configs and copy them to the return vector. |
+ PP_VideoConfigElement* c_matching_configs = |
+ new PP_VideoConfigElement[num_of_matching_configs]; |
brettw
2011/05/31 12:46:44
You can also copy straight into the vector and avo
Ville-Mikko Rautio
2011/05/31 13:33:14
Done.
|
+ get_interface<PPB_VideoDecoder_Dev>()->GetConfigs( |
+ instance->pp_instance(), c_proto, c_matching_configs, |
+ num_of_matching_configs, &num_of_matching_configs); |
+ std::copy(c_matching_configs, |
+ c_matching_configs + num_of_matching_configs, |
+ matching_configs.end()); |
+ delete[] c_proto; |
+ delete[] c_matching_configs; |
return matching_configs; |
} |
-void VideoDecoder::AssignGLESBuffers(uint32_t /* no_of_buffers */, |
- const PP_GLESBuffer_Dev& /* buffers */) { |
- // TODO(vmr): Implement. |
+void VideoDecoder::AssignGLESBuffers( |
+ const std::vector<PP_GLESBuffer_Dev> buffers) { |
+ if (!has_interface<PPB_VideoDecoder_Dev>() || !pp_resource()) |
+ return; |
+ PP_GLESBuffer_Dev* gles_buffers = new PP_GLESBuffer_Dev[buffers.size()]; |
+ if (!gles_buffers) { |
brettw
2011/05/31 12:46:44
We don't normally check for OOM (and neither do yo
Ville-Mikko Rautio
2011/05/31 13:33:14
Done.
|
+ assert(!"Out of memory."); |
+ return; |
+ } |
+ std::copy(buffers.begin(), buffers.end(), gles_buffers); |
brettw
2011/05/31 12:46:44
I think you can avoid this copy.
Ville-Mikko Rautio
2011/05/31 13:33:14
Done.
|
+ get_interface<PPB_VideoDecoder_Dev>()->AssignGLESBuffers( |
+ pp_resource(), buffers.size(), gles_buffers); |
+ delete[] gles_buffers; |
} |
void VideoDecoder::AssignSysmemBuffers( |
- uint32_t /* no_of_buffers */, |
- const PP_SysmemBuffer_Dev& /* buffers */) { |
- // TODO(vmr): Implement. |
+ const std::vector<PP_SysmemBuffer_Dev> buffers) { |
+ if (!has_interface<PPB_VideoDecoder_Dev>() || !pp_resource()) |
+ return; |
+ PP_SysmemBuffer_Dev* sysmem_buffers = new PP_SysmemBuffer_Dev[buffers.size()]; |
+ if (!sysmem_buffers) { |
+ assert(!"Out of memory."); |
+ return; |
+ } |
+ std::copy(buffers.begin(), buffers.end(), sysmem_buffers); |
+ get_interface<PPB_VideoDecoder_Dev>()->AssignSysmemBuffers( |
+ pp_resource(), buffers.size(), sysmem_buffers); |
+ delete[] sysmem_buffers; |
} |
bool VideoDecoder::Decode( |
- const PP_VideoBitstreamBuffer_Dev& /* bitstream_buffer */, |
- CompletionCallback /* callback */) { |
- // TODO(vmr): Implement. |
+ const PP_VideoBitstreamBuffer_Dev& bitstream_buffer, |
+ CompletionCallback callback) { |
if (!has_interface<PPB_VideoDecoder_Dev>() || !pp_resource()) |
return false; |
- return false; |
+ return PPBoolToBool(get_interface<PPB_VideoDecoder_Dev>()->Decode( |
+ pp_resource(), |
+ const_cast<PP_VideoBitstreamBuffer_Dev*>(&bitstream_buffer), |
+ callback.pp_completion_callback())); |
} |
-void VideoDecoder::ReusePictureBuffer(int32_t /* picture_buffer_id */) { |
- // TODO(vmr): Implement. |
+void VideoDecoder::ReusePictureBuffer(int32_t picture_buffer_id) { |
+ if (!has_interface<PPB_VideoDecoder_Dev>() || !pp_resource()) |
+ return; |
+ get_interface<PPB_VideoDecoder_Dev>()->ReusePictureBuffer( |
+ pp_resource(), picture_buffer_id); |
} |
-bool VideoDecoder::Flush(CompletionCallback /* callback */) { |
- // TODO(vmr): Implement. |
- if (!has_interface<PPB_VideoDecoder_Dev>()) |
+bool VideoDecoder::Flush(CompletionCallback callback) { |
+ if (!has_interface<PPB_VideoDecoder_Dev>() || !pp_resource()) |
return false; |
- return true; |
+ return PPBoolToBool(get_interface<PPB_VideoDecoder_Dev>()->Flush( |
+ pp_resource(), callback.pp_completion_callback())); |
} |
-bool VideoDecoder::Abort(CompletionCallback /* callback */) { |
- // TODO(vmr): Implement. |
- if (!has_interface<PPB_VideoDecoder_Dev>()) |
+bool VideoDecoder::Abort(CompletionCallback callback) { |
+ if (!has_interface<PPB_VideoDecoder_Dev>() || !pp_resource()) |
return false; |
- return true; |
+ return PPBoolToBool(get_interface<PPB_VideoDecoder_Dev>()->Abort( |
+ pp_resource(), callback.pp_completion_callback())); |
} |
} // namespace pp |