Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Side by Side Diff: native_client_sdk/src/examples/api/video_encode/video_encode.cc

Issue 1226203010: ppapi: VideoEncoder: augment precision of the IVF container (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | ppapi/examples/video_encode/video_encode.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 <math.h> 5 #include <math.h>
6 #include <stdio.h> 6 #include <stdio.h>
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <deque>
10 #include <iostream> 11 #include <iostream>
11 #include <map> 12 #include <map>
12 #include <sstream> 13 #include <sstream>
13 #include <vector> 14 #include <vector>
14 15
15 #include "ppapi/c/pp_errors.h" 16 #include "ppapi/c/pp_errors.h"
16 #include "ppapi/c/ppb_console.h" 17 #include "ppapi/c/ppb_console.h"
17 #include "ppapi/cpp/input_event.h" 18 #include "ppapi/cpp/input_event.h"
18 #include "ppapi/cpp/instance.h" 19 #include "ppapi/cpp/instance.h"
19 #include "ppapi/cpp/media_stream_video_track.h" 20 #include "ppapi/cpp/media_stream_video_track.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 int32_t height) { 82 int32_t height) {
82 mem[0] = 'D'; 83 mem[0] = 'D';
83 mem[1] = 'K'; 84 mem[1] = 'K';
84 mem[2] = 'I'; 85 mem[2] = 'I';
85 mem[3] = 'F'; 86 mem[3] = 'F';
86 PutLE16(mem + 4, 0); // version 87 PutLE16(mem + 4, 0); // version
87 PutLE16(mem + 6, 32); // header size 88 PutLE16(mem + 6, 32); // header size
88 PutLE32(mem + 8, fourcc('V', 'P', '8', '0')); // fourcc 89 PutLE32(mem + 8, fourcc('V', 'P', '8', '0')); // fourcc
89 PutLE16(mem + 12, static_cast<uint16_t>(width)); // width 90 PutLE16(mem + 12, static_cast<uint16_t>(width)); // width
90 PutLE16(mem + 14, static_cast<uint16_t>(height)); // height 91 PutLE16(mem + 14, static_cast<uint16_t>(height)); // height
91 PutLE32(mem + 16, 30); // rate 92 PutLE32(mem + 16, 1000); // rate
92 PutLE32(mem + 20, 1); // scale 93 PutLE32(mem + 20, 1); // scale
93 PutLE32(mem + 24, 0xffffffff); // length 94 PutLE32(mem + 24, 0xffffffff); // length
94 PutLE32(mem + 28, 0); // unused 95 PutLE32(mem + 28, 0); // unused
95 96
96 return 32; 97 return 32;
97 } 98 }
98 99
99 uint32_t IVFWriter::WriteFrameHeader(uint8_t* mem, 100 uint32_t IVFWriter::WriteFrameHeader(uint8_t* mem,
100 uint64_t pts, 101 uint64_t pts,
101 size_t frame_size) { 102 size_t frame_size) {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 pp::CompletionCallbackFactory<VideoEncoderInstance> callback_factory_; 174 pp::CompletionCallbackFactory<VideoEncoderInstance> callback_factory_;
174 175
175 PP_VideoProfile video_profile_; 176 PP_VideoProfile video_profile_;
176 PP_VideoFrame_Format frame_format_; 177 PP_VideoFrame_Format frame_format_;
177 178
178 pp::Size requested_size_; 179 pp::Size requested_size_;
179 pp::Size frame_size_; 180 pp::Size frame_size_;
180 pp::Size encoder_size_; 181 pp::Size encoder_size_;
181 uint32_t encoded_frames_; 182 uint32_t encoded_frames_;
182 183
184 std::deque<uint64_t> frames_timestamps_;
185
183 pp::VideoFrame current_track_frame_; 186 pp::VideoFrame current_track_frame_;
184 187
185 IVFWriter ivf_writer_; 188 IVFWriter ivf_writer_;
186 189
187 PP_Time last_encode_tick_; 190 PP_Time last_encode_tick_;
188 }; 191 };
189 192
190 VideoEncoderInstance::VideoEncoderInstance(PP_Instance instance, 193 VideoEncoderInstance::VideoEncoderInstance(PP_Instance instance,
191 pp::Module* module) 194 pp::Module* module)
192 : pp::Instance(instance), 195 : pp::Instance(instance),
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 int32_t idx = 0; 304 int32_t idx = 0;
302 for (uint32_t i = 0; i < profiles.size(); i++) { 305 for (uint32_t i = 0; i < profiles.size(); i++) {
303 const PP_VideoProfileDescription& profile = profiles[i]; 306 const PP_VideoProfileDescription& profile = profiles[i];
304 js_profiles.Set(idx++, pp::Var(VideoProfileToString(profile.profile))); 307 js_profiles.Set(idx++, pp::Var(VideoProfileToString(profile.profile)));
305 } 308 }
306 PostMessage(dict); 309 PostMessage(dict);
307 } 310 }
308 311
309 void VideoEncoderInstance::StartEncoder() { 312 void VideoEncoderInstance::StartEncoder() {
310 video_encoder_ = pp::VideoEncoder(this); 313 video_encoder_ = pp::VideoEncoder(this);
314 frames_timestamps_.clear();
311 315
312 int32_t error = video_encoder_.Initialize( 316 int32_t error = video_encoder_.Initialize(
313 frame_format_, frame_size_, video_profile_, 2000000, 317 frame_format_, frame_size_, video_profile_, 2000000,
314 PP_HARDWAREACCELERATION_WITHFALLBACK, 318 PP_HARDWAREACCELERATION_WITHFALLBACK,
315 callback_factory_.NewCallback( 319 callback_factory_.NewCallback(
316 &VideoEncoderInstance::OnInitializedEncoder)); 320 &VideoEncoderInstance::OnInitializedEncoder));
317 if (error != PP_OK_COMPLETIONPENDING) { 321 if (error != PP_OK_COMPLETIONPENDING) {
318 LogError(error, "Cannot initialize encoder"); 322 LogError(error, "Cannot initialize encoder");
319 return; 323 return;
320 } 324 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 LogError(PP_ERROR_FAILED, oss.str()); 422 LogError(PP_ERROR_FAILED, oss.str());
419 return PP_ERROR_FAILED; 423 return PP_ERROR_FAILED;
420 } 424 }
421 425
422 dest.SetTimestamp(src.GetTimestamp()); 426 dest.SetTimestamp(src.GetTimestamp());
423 memcpy(dest.GetDataBuffer(), src.GetDataBuffer(), src.GetDataBufferSize()); 427 memcpy(dest.GetDataBuffer(), src.GetDataBuffer(), src.GetDataBufferSize());
424 return PP_OK; 428 return PP_OK;
425 } 429 }
426 430
427 void VideoEncoderInstance::EncodeFrame(const pp::VideoFrame& frame) { 431 void VideoEncoderInstance::EncodeFrame(const pp::VideoFrame& frame) {
432 frames_timestamps_.push_back(
433 static_cast<uint64_t>(frame.GetTimestamp() * 1000));
428 video_encoder_.Encode( 434 video_encoder_.Encode(
429 frame, PP_FALSE, 435 frame, PP_FALSE,
430 callback_factory_.NewCallback(&VideoEncoderInstance::OnEncodeDone)); 436 callback_factory_.NewCallback(&VideoEncoderInstance::OnEncodeDone));
431 } 437 }
432 438
433 void VideoEncoderInstance::OnEncodeDone(int32_t result) { 439 void VideoEncoderInstance::OnEncodeDone(int32_t result) {
434 if (result == PP_ERROR_ABORTED) 440 if (result == PP_ERROR_ABORTED)
435 return; 441 return;
436 if (result != PP_OK) 442 if (result != PP_OK)
437 LogError(result, "Encode failed"); 443 LogError(result, "Encode failed");
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 size + ivf_writer_.GetFileHeaderSize() + 551 size + ivf_writer_.GetFileHeaderSize() +
546 ivf_writer_.GetFrameHeaderSize()); 552 ivf_writer_.GetFrameHeaderSize());
547 data_ptr = static_cast<uint8_t*>(array_buffer.Map()); 553 data_ptr = static_cast<uint8_t*>(array_buffer.Map());
548 frame_offset = ivf_writer_.WriteFileHeader( 554 frame_offset = ivf_writer_.WriteFileHeader(
549 data_ptr, frame_size_.width(), frame_size_.height()); 555 data_ptr, frame_size_.width(), frame_size_.height());
550 } else { 556 } else {
551 array_buffer = pp::VarArrayBuffer( 557 array_buffer = pp::VarArrayBuffer(
552 size + ivf_writer_.GetFrameHeaderSize()); 558 size + ivf_writer_.GetFrameHeaderSize());
553 data_ptr = static_cast<uint8_t*>(array_buffer.Map()); 559 data_ptr = static_cast<uint8_t*>(array_buffer.Map());
554 } 560 }
555 data_offset = frame_offset + 561 uint64_t timestamp = frames_timestamps_.front();
556 ivf_writer_.WriteFrameHeader(data_ptr + frame_offset, 562 frames_timestamps_.pop_front();
557 encoded_frames_, 563 data_offset =
558 size); 564 frame_offset +
565 ivf_writer_.WriteFrameHeader(data_ptr + frame_offset, timestamp, size);
559 } else { 566 } else {
560 array_buffer = pp::VarArrayBuffer(size); 567 array_buffer = pp::VarArrayBuffer(size);
561 data_ptr = static_cast<uint8_t*>(array_buffer.Map()); 568 data_ptr = static_cast<uint8_t*>(array_buffer.Map());
562 } 569 }
563 570
564 memcpy(data_ptr + data_offset, buffer, size); 571 memcpy(data_ptr + data_offset, buffer, size);
565 array_buffer.Unmap(); 572 array_buffer.Unmap();
566 dictionary.Set(pp::Var("data"), array_buffer); 573 dictionary.Set(pp::Var("data"), array_buffer);
567 574
568 PostMessage(dictionary); 575 PostMessage(dictionary);
(...skipping 21 matching lines...) Expand all
590 } 597 }
591 598
592 } // anonymous namespace 599 } // anonymous namespace
593 600
594 namespace pp { 601 namespace pp {
595 // Factory function for your specialization of the Module object. 602 // Factory function for your specialization of the Module object.
596 Module* CreateModule() { 603 Module* CreateModule() {
597 return new VideoEncoderModule(); 604 return new VideoEncoderModule();
598 } 605 }
599 } // namespace pp 606 } // namespace pp
OLDNEW
« no previous file with comments | « no previous file | ppapi/examples/video_encode/video_encode.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698