| OLD | NEW |
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2004 Google Inc. | 3 * Copyright 2004 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 void VideoRecorder::Stop() { | 53 void VideoRecorder::Stop() { |
| 54 video_file_.Close(); | 54 video_file_.Close(); |
| 55 } | 55 } |
| 56 | 56 |
| 57 bool VideoRecorder::RecordFrame(const CapturedFrame& frame) { | 57 bool VideoRecorder::RecordFrame(const CapturedFrame& frame) { |
| 58 if (rtc::SS_CLOSED == video_file_.GetState()) { | 58 if (rtc::SS_CLOSED == video_file_.GetState()) { |
| 59 LOG(LS_ERROR) << "File not opened yet"; | 59 LOG(LS_ERROR) << "File not opened yet"; |
| 60 return false; | 60 return false; |
| 61 } | 61 } |
| 62 | 62 |
| 63 uint32 size = 0; | 63 uint32_t size = 0; |
| 64 if (!frame.GetDataSize(&size)) { | 64 if (!frame.GetDataSize(&size)) { |
| 65 LOG(LS_ERROR) << "Unable to calculate the data size of the frame"; | 65 LOG(LS_ERROR) << "Unable to calculate the data size of the frame"; |
| 66 return false; | 66 return false; |
| 67 } | 67 } |
| 68 | 68 |
| 69 if (write_header_) { | 69 if (write_header_) { |
| 70 // Convert the frame header to bytebuffer. | 70 // Convert the frame header to bytebuffer. |
| 71 rtc::ByteBuffer buffer; | 71 rtc::ByteBuffer buffer; |
| 72 buffer.WriteUInt32(frame.width); | 72 buffer.WriteUInt32(frame.width); |
| 73 buffer.WriteUInt32(frame.height); | 73 buffer.WriteUInt32(frame.height); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 FileVideoCapturer* capturer_; | 151 FileVideoCapturer* capturer_; |
| 152 mutable rtc::CriticalSection crit_; | 152 mutable rtc::CriticalSection crit_; |
| 153 bool finished_; | 153 bool finished_; |
| 154 | 154 |
| 155 RTC_DISALLOW_COPY_AND_ASSIGN(FileReadThread); | 155 RTC_DISALLOW_COPY_AND_ASSIGN(FileReadThread); |
| 156 }; | 156 }; |
| 157 | 157 |
| 158 ///////////////////////////////////////////////////////////////////// | 158 ///////////////////////////////////////////////////////////////////// |
| 159 // Implementation of class FileVideoCapturer | 159 // Implementation of class FileVideoCapturer |
| 160 ///////////////////////////////////////////////////////////////////// | 160 ///////////////////////////////////////////////////////////////////// |
| 161 static const int64 kNumNanoSecsPerMilliSec = 1000000; | 161 static const int64_t kNumNanoSecsPerMilliSec = 1000000; |
| 162 const char* FileVideoCapturer::kVideoFileDevicePrefix = "video-file:"; | 162 const char* FileVideoCapturer::kVideoFileDevicePrefix = "video-file:"; |
| 163 | 163 |
| 164 FileVideoCapturer::FileVideoCapturer() | 164 FileVideoCapturer::FileVideoCapturer() |
| 165 : frame_buffer_size_(0), | 165 : frame_buffer_size_(0), |
| 166 file_read_thread_(NULL), | 166 file_read_thread_(NULL), |
| 167 repeat_(0), | 167 repeat_(0), |
| 168 last_frame_timestamp_ns_(0), | 168 last_frame_timestamp_ns_(0), |
| 169 ignore_framerate_(false) { | 169 ignore_framerate_(false) { |
| 170 } | 170 } |
| 171 | 171 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 | 260 |
| 261 void FileVideoCapturer::Stop() { | 261 void FileVideoCapturer::Stop() { |
| 262 if (file_read_thread_) { | 262 if (file_read_thread_) { |
| 263 file_read_thread_->Stop(); | 263 file_read_thread_->Stop(); |
| 264 file_read_thread_ = NULL; | 264 file_read_thread_ = NULL; |
| 265 LOG(LS_INFO) << "File video capturer '" << GetId() << "' stopped"; | 265 LOG(LS_INFO) << "File video capturer '" << GetId() << "' stopped"; |
| 266 } | 266 } |
| 267 SetCaptureFormat(NULL); | 267 SetCaptureFormat(NULL); |
| 268 } | 268 } |
| 269 | 269 |
| 270 bool FileVideoCapturer::GetPreferredFourccs(std::vector<uint32>* fourccs) { | 270 bool FileVideoCapturer::GetPreferredFourccs(std::vector<uint32_t>* fourccs) { |
| 271 if (!fourccs) { | 271 if (!fourccs) { |
| 272 return false; | 272 return false; |
| 273 } | 273 } |
| 274 | 274 |
| 275 fourccs->push_back(GetSupportedFormats()->at(0).fourcc); | 275 fourccs->push_back(GetSupportedFormats()->at(0).fourcc); |
| 276 return true; | 276 return true; |
| 277 } | 277 } |
| 278 | 278 |
| 279 rtc::StreamResult FileVideoCapturer::ReadFrameHeader( | 279 rtc::StreamResult FileVideoCapturer::ReadFrameHeader( |
| 280 CapturedFrame* frame) { | 280 CapturedFrame* frame) { |
| 281 // We first read kFrameHeaderSize bytes from the file stream to a memory | 281 // We first read kFrameHeaderSize bytes from the file stream to a memory |
| 282 // buffer, then construct a bytebuffer from the memory buffer, and finally | 282 // buffer, then construct a bytebuffer from the memory buffer, and finally |
| 283 // read the frame header from the bytebuffer. | 283 // read the frame header from the bytebuffer. |
| 284 char header[CapturedFrame::kFrameHeaderSize]; | 284 char header[CapturedFrame::kFrameHeaderSize]; |
| 285 rtc::StreamResult sr; | 285 rtc::StreamResult sr; |
| 286 size_t bytes_read; | 286 size_t bytes_read; |
| 287 int error; | 287 int error; |
| 288 sr = video_file_.Read(header, | 288 sr = video_file_.Read(header, |
| 289 CapturedFrame::kFrameHeaderSize, | 289 CapturedFrame::kFrameHeaderSize, |
| 290 &bytes_read, | 290 &bytes_read, |
| 291 &error); | 291 &error); |
| 292 LOG(LS_VERBOSE) << "Read frame header: stream_result = " << sr | 292 LOG(LS_VERBOSE) << "Read frame header: stream_result = " << sr |
| 293 << ", bytes read = " << bytes_read << ", error = " << error; | 293 << ", bytes read = " << bytes_read << ", error = " << error; |
| 294 if (rtc::SR_SUCCESS == sr) { | 294 if (rtc::SR_SUCCESS == sr) { |
| 295 if (CapturedFrame::kFrameHeaderSize != bytes_read) { | 295 if (CapturedFrame::kFrameHeaderSize != bytes_read) { |
| 296 return rtc::SR_EOS; | 296 return rtc::SR_EOS; |
| 297 } | 297 } |
| 298 rtc::ByteBuffer buffer(header, CapturedFrame::kFrameHeaderSize); | 298 rtc::ByteBuffer buffer(header, CapturedFrame::kFrameHeaderSize); |
| 299 buffer.ReadUInt32(reinterpret_cast<uint32*>(&frame->width)); | 299 buffer.ReadUInt32(reinterpret_cast<uint32_t*>(&frame->width)); |
| 300 buffer.ReadUInt32(reinterpret_cast<uint32*>(&frame->height)); | 300 buffer.ReadUInt32(reinterpret_cast<uint32_t*>(&frame->height)); |
| 301 buffer.ReadUInt32(&frame->fourcc); | 301 buffer.ReadUInt32(&frame->fourcc); |
| 302 buffer.ReadUInt32(&frame->pixel_width); | 302 buffer.ReadUInt32(&frame->pixel_width); |
| 303 buffer.ReadUInt32(&frame->pixel_height); | 303 buffer.ReadUInt32(&frame->pixel_height); |
| 304 // Elapsed time is deprecated. | 304 // Elapsed time is deprecated. |
| 305 uint64 dummy_elapsed_time; | 305 uint64_t dummy_elapsed_time; |
| 306 buffer.ReadUInt64(&dummy_elapsed_time); | 306 buffer.ReadUInt64(&dummy_elapsed_time); |
| 307 buffer.ReadUInt64(reinterpret_cast<uint64*>(&frame->time_stamp)); | 307 buffer.ReadUInt64(reinterpret_cast<uint64_t*>(&frame->time_stamp)); |
| 308 buffer.ReadUInt32(&frame->data_size); | 308 buffer.ReadUInt32(&frame->data_size); |
| 309 } | 309 } |
| 310 | 310 |
| 311 return sr; | 311 return sr; |
| 312 } | 312 } |
| 313 | 313 |
| 314 // Executed in the context of FileReadThread. | 314 // Executed in the context of FileReadThread. |
| 315 bool FileVideoCapturer::ReadFrame(bool first_frame, int* wait_time_ms) { | 315 bool FileVideoCapturer::ReadFrame(bool first_frame, int* wait_time_ms) { |
| 316 uint32 start_read_time_ms = rtc::Time(); | 316 uint32_t start_read_time_ms = rtc::Time(); |
| 317 | 317 |
| 318 // 1. Signal the previously read frame to downstream. | 318 // 1. Signal the previously read frame to downstream. |
| 319 if (!first_frame) { | 319 if (!first_frame) { |
| 320 captured_frame_.time_stamp = kNumNanoSecsPerMilliSec * | 320 captured_frame_.time_stamp = |
| 321 static_cast<int64>(start_read_time_ms); | 321 kNumNanoSecsPerMilliSec * static_cast<int64_t>(start_read_time_ms); |
| 322 SignalFrameCaptured(this, &captured_frame_); | 322 SignalFrameCaptured(this, &captured_frame_); |
| 323 } | 323 } |
| 324 | 324 |
| 325 // 2. Read the next frame. | 325 // 2. Read the next frame. |
| 326 if (rtc::SS_CLOSED == video_file_.GetState()) { | 326 if (rtc::SS_CLOSED == video_file_.GetState()) { |
| 327 LOG(LS_ERROR) << "File not opened yet"; | 327 LOG(LS_ERROR) << "File not opened yet"; |
| 328 return false; | 328 return false; |
| 329 } | 329 } |
| 330 // 2.1 Read the frame header. | 330 // 2.1 Read the frame header. |
| 331 rtc::StreamResult result = ReadFrameHeader(&captured_frame_); | 331 rtc::StreamResult result = ReadFrameHeader(&captured_frame_); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 360 return false; | 360 return false; |
| 361 } | 361 } |
| 362 | 362 |
| 363 // 3. Decide how long to wait for the next frame. | 363 // 3. Decide how long to wait for the next frame. |
| 364 *wait_time_ms = 0; | 364 *wait_time_ms = 0; |
| 365 | 365 |
| 366 // If the capture format's interval is not kMinimumInterval, we use it to | 366 // If the capture format's interval is not kMinimumInterval, we use it to |
| 367 // control the rate; otherwise, we use the timestamp in the file to control | 367 // control the rate; otherwise, we use the timestamp in the file to control |
| 368 // the rate. | 368 // the rate. |
| 369 if (!first_frame && !ignore_framerate_) { | 369 if (!first_frame && !ignore_framerate_) { |
| 370 int64 interval_ns = | 370 int64_t interval_ns = |
| 371 GetCaptureFormat()->interval > VideoFormat::kMinimumInterval ? | 371 GetCaptureFormat()->interval > VideoFormat::kMinimumInterval |
| 372 GetCaptureFormat()->interval : | 372 ? GetCaptureFormat()->interval |
| 373 captured_frame_.time_stamp - last_frame_timestamp_ns_; | 373 : captured_frame_.time_stamp - last_frame_timestamp_ns_; |
| 374 int interval_ms = static_cast<int>(interval_ns / kNumNanoSecsPerMilliSec); | 374 int interval_ms = static_cast<int>(interval_ns / kNumNanoSecsPerMilliSec); |
| 375 interval_ms -= rtc::Time() - start_read_time_ms; | 375 interval_ms -= rtc::Time() - start_read_time_ms; |
| 376 if (interval_ms > 0) { | 376 if (interval_ms > 0) { |
| 377 *wait_time_ms = interval_ms; | 377 *wait_time_ms = interval_ms; |
| 378 } | 378 } |
| 379 } | 379 } |
| 380 // Keep the original timestamp read from the file. | 380 // Keep the original timestamp read from the file. |
| 381 last_frame_timestamp_ns_ = captured_frame_.time_stamp; | 381 last_frame_timestamp_ns_ = captured_frame_.time_stamp; |
| 382 return true; | 382 return true; |
| 383 } | 383 } |
| 384 | 384 |
| 385 } // namespace cricket | 385 } // namespace cricket |
| OLD | NEW |