Index: ppapi/examples/gles2/gles2.cc |
diff --git a/ppapi/examples/gles2/gles2.cc b/ppapi/examples/gles2/gles2.cc |
index 51877623a652a2e39c93ffc7dfc2558cfaa7a8f1..69c0bc8c6707bf291e849b54b1ac9f488e06a6e8 100644 |
--- a/ppapi/examples/gles2/gles2.cc |
+++ b/ppapi/examples/gles2/gles2.cc |
@@ -4,6 +4,11 @@ |
#include <string.h> |
+#include <iostream> |
+#include <map> |
+#include <set> |
+#include <vector> |
+ |
#include "ppapi/c/dev/ppb_opengles_dev.h" |
#include "ppapi/c/pp_errors.h" |
#include "ppapi/cpp/dev/context_3d_dev.h" |
@@ -18,11 +23,11 @@ |
#include "ppapi/examples/gles2/testdata.h" |
#include "ppapi/lib/gl/include/GLES2/gl2.h" |
-// Prevent "unused variable" warnings when building in Release mode. |
-#ifdef NDEBUG |
-#undef assert |
-#define assert(expr) while (0 && (expr)) |
-#endif // NDEBUG |
+// Use assert as a poor-man's CHECK, even in non-debug mode. |
+// Since <assert.h> redefines assert on every inclusion (it doesn't use |
+// include-guards), make sure this is the last file #include'd in this file. |
scherkus (not reviewing)
2011/06/21 01:22:27
:(
|
+#undef NDEBUG |
+#include <assert.h> |
namespace { |
@@ -58,6 +63,8 @@ class GLES2DemoInstance : public pp::Instance, public pp::Graphics3DClient_Dev, |
pp::VideoDecoder_Dev decoder, PP_VideoDecodeError_Dev error); |
private: |
+ enum { kNumConcurrentDecodes = 7 }; |
+ |
// Helper struct that stores data used by the shader program. |
struct ShaderInfo { |
GLint pos_location; |
@@ -84,6 +91,7 @@ class GLES2DemoInstance : public pp::Instance, public pp::Graphics3DClient_Dev, |
void DecoderAbortDone(int32_t result); |
// Decode helpers. |
+ void DecodeNextNALUs(); |
void DecodeNextNALU(); |
void GetNextNALUBoundary(size_t start_pos, size_t* end_pos); |
void Render(const PP_GLESBuffer_Dev& buffer); |
@@ -108,6 +116,7 @@ class GLES2DemoInstance : public pp::Instance, public pp::Graphics3DClient_Dev, |
bool is_painting_; |
pp::CompletionCallbackFactory<GLES2DemoInstance> callback_factory_; |
size_t encoded_data_next_pos_to_decode_; |
+ std::set<int> bitstream_ids_at_decoder_; |
// Map of texture buffers indexed by buffer id. |
typedef std::map<int, PP_GLESBuffer_Dev> PictureBufferMap; |
@@ -173,19 +182,23 @@ void GLES2DemoInstance::InitializeDecoder() { |
} |
void GLES2DemoInstance::DecoderInitDone(int32_t result) { |
- DecodeNextNALU(); |
+ DecodeNextNALUs(); |
} |
void GLES2DemoInstance::DecoderBitstreamDone( |
int32_t result, int bitstream_buffer_id) { |
+ assert(bitstream_ids_at_decoder_.erase(bitstream_buffer_id) == 1); |
BitstreamBufferMap::iterator it = |
bitstream_buffers_by_id_.find(bitstream_buffer_id); |
assert(it != bitstream_buffers_by_id_.end()); |
delete it->second; |
- DecodeNextNALU(); |
+ DecodeNextNALUs(); |
} |
void GLES2DemoInstance::DecoderFlushDone(int32_t result) { |
+ // Check that each bitstream buffer ID we handed to the decoder got handed |
+ // back to us. |
+ assert(!bitstream_ids_at_decoder_.size()); |
scherkus (not reviewing)
2011/06/21 01:22:27
empty?
Ami GONE FROM CHROMIUM
2011/06/21 01:35:22
Done.
|
} |
void GLES2DemoInstance::DecoderAbortDone(int32_t result) { |
@@ -212,8 +225,16 @@ void GLES2DemoInstance::GetNextNALUBoundary( |
} |
} |
+void GLES2DemoInstance::DecodeNextNALUs() { |
+ while (encoded_data_next_pos_to_decode_ <= kDataLen && |
+ bitstream_ids_at_decoder_.size() < kNumConcurrentDecodes) { |
+ DecodeNextNALU(); |
+ } |
+} |
+ |
void GLES2DemoInstance::DecodeNextNALU() { |
if (encoded_data_next_pos_to_decode_ == kDataLen) { |
+ ++encoded_data_next_pos_to_decode_; |
pp::CompletionCallback cb = |
callback_factory_.NewCallback(&GLES2DemoInstance::DecoderFlushDone); |
video_decoder_->Flush(cb); |
@@ -229,13 +250,12 @@ void GLES2DemoInstance::DecodeNextNALU() { |
bitstream_buffer.size = end_pos - start_pos; |
bitstream_buffer.data = buffer->pp_resource(); |
memcpy(buffer->data(), kData + start_pos, end_pos - start_pos); |
- bool result = |
- bitstream_buffers_by_id_.insert(std::make_pair(id, buffer)).second; |
- assert(result); |
+ assert(bitstream_buffers_by_id_.insert(std::make_pair(id, buffer)).second); |
scherkus (not reviewing)
2011/06/21 01:22:27
I'm guessing assert doesn't get optimized out in r
|
pp::CompletionCallback cb = |
callback_factory_.NewCallback( |
&GLES2DemoInstance::DecoderBitstreamDone, id); |
+ assert(bitstream_ids_at_decoder_.insert(id).second); |
scherkus (not reviewing)
2011/06/21 01:22:27
ditto here
|
video_decoder_->Decode(bitstream_buffer, cb); |
encoded_data_next_pos_to_decode_ = end_pos; |
} |
@@ -250,8 +270,7 @@ void GLES2DemoInstance::ProvidePictureBuffers( |
int id = ++next_picture_buffer_id_; |
buffer.info.id= id; |
buffers.push_back(buffer); |
- bool result = buffers_by_id_.insert(std::make_pair(id, buffer)).second; |
- assert(result); |
+ assert(buffers_by_id_.insert(std::make_pair(id, buffer)).second); |
scherkus (not reviewing)
2011/06/21 01:22:27
etc
|
} |
FinishGL(); |
video_decoder_->AssignGLESBuffers(buffers); |
@@ -310,16 +329,14 @@ void GLES2DemoInstance::InitGL() { |
surface_ = new pp::Surface3D_Dev(*this, 0, surface_attributes); |
assert(!surface_->is_null()); |
- int32_t bind_error = context_->BindSurfaces(*surface_, *surface_); |
- assert(!bind_error); |
+ assert(!context_->BindSurfaces(*surface_, *surface_)); |
// Set viewport window size and clear color bit. |
gles2_if_->Clear(context_->pp_resource(), GL_COLOR_BUFFER_BIT); |
gles2_if_->Viewport(context_->pp_resource(), 0, 0, |
position_size_.width(), position_size_.height()); |
- bool success = BindGraphics(*surface_); |
- assert(success); |
+ assert(BindGraphics(*surface_)); |
assertNoGLError(); |
CreateGLObjects(); |
@@ -346,8 +363,7 @@ void GLES2DemoInstance::Render(const PP_GLESBuffer_Dev& buffer) { |
pp::CompletionCallback cb = |
callback_factory_.NewCallback( |
&GLES2DemoInstance::PaintFinished, buffer.info.id); |
- int32_t error = surface_->SwapBuffers(cb); |
- assert(error == PP_ERROR_WOULDBLOCK); |
+ assert(surface_->SwapBuffers(cb) == PP_ERROR_WOULDBLOCK); |
assertNoGLError(); |
} |