Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "media/video/ffmpeg_video_decode_engine.h" | 5 #include "media/video/ffmpeg_video_decode_engine.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/string_number_conversions.h" | 8 #include "base/string_number_conversions.h" |
| 9 #include "base/task.h" | 9 #include "base/task.h" |
| 10 #include "media/base/buffers.h" | 10 #include "media/base/buffers.h" |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 // Create output buffer pool when direct rendering is not used. | 113 // Create output buffer pool when direct rendering is not used. |
| 114 for (size_t i = 0; i < Limits::kMaxVideoFrames; ++i) { | 114 for (size_t i = 0; i < Limits::kMaxVideoFrames; ++i) { |
| 115 scoped_refptr<VideoFrame> video_frame = | 115 scoped_refptr<VideoFrame> video_frame = |
| 116 VideoFrame::CreateFrame(VideoFrame::YV12, | 116 VideoFrame::CreateFrame(VideoFrame::YV12, |
| 117 config.width(), | 117 config.width(), |
| 118 config.height(), | 118 config.height(), |
| 119 kNoTimestamp, | 119 kNoTimestamp, |
| 120 kNoTimestamp); | 120 kNoTimestamp); |
| 121 frame_queue_available_.push_back(video_frame); | 121 frame_queue_available_.push_back(video_frame); |
| 122 } | 122 } |
| 123 | |
| 123 codec_context_->thread_count = decode_threads; | 124 codec_context_->thread_count = decode_threads; |
| 124 if (codec && | 125 if (codec && |
| 125 avcodec_open(codec_context_, codec) >= 0 && | 126 avcodec_open(codec_context_, codec) >= 0 && |
| 126 av_frame_.get()) { | 127 av_frame_.get()) { |
| 127 info.success = true; | 128 info.success = true; |
| 128 } | 129 } |
| 129 event_handler_ = event_handler; | 130 event_handler_ = event_handler; |
| 130 event_handler_->OnInitializeComplete(info); | 131 event_handler_->OnInitializeComplete(info); |
| 131 } | 132 } |
| 132 | 133 |
| 133 void FFmpegVideoDecodeEngine::ConsumeVideoSample( | 134 void FFmpegVideoDecodeEngine::ConsumeVideoSample( |
| 134 scoped_refptr<Buffer> buffer) { | 135 scoped_refptr<Buffer> buffer) { |
| 136 static int i = -1; | |
| 137 | |
| 138 if (i >= 0) { | |
|
scherkus (not reviewing)
2011/08/11 01:26:29
woah!??
what's all this doing
acolwell GONE FROM CHROMIUM
2011/08/11 23:54:40
Oops. This is how I was extracting data for test f
| |
| 139 char filename[100]; | |
| 140 sprintf(filename, "vp8-frame-%d", i++); | |
| 141 printf("%s\n", filename); | |
| 142 FILE* f = fopen(filename, "wb"); | |
| 143 DCHECK(f); | |
| 144 fwrite(buffer->GetData(), buffer->GetDataSize(), 1, f); | |
| 145 fclose(f); | |
| 146 } | |
| 147 | |
| 135 pending_input_buffers_--; | 148 pending_input_buffers_--; |
| 136 if (flush_pending_) { | 149 if (flush_pending_) { |
| 137 TryToFinishPendingFlush(); | 150 TryToFinishPendingFlush(); |
| 138 } else { | 151 } else { |
| 139 // Otherwise try to decode this buffer. | 152 // Otherwise try to decode this buffer. |
| 140 DecodeFrame(buffer); | 153 DecodeFrame(buffer); |
| 141 } | 154 } |
| 142 } | 155 } |
| 143 | 156 |
| 144 void FFmpegVideoDecodeEngine::ProduceVideoFrame( | 157 void FFmpegVideoDecodeEngine::ProduceVideoFrame( |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 179 | 192 |
| 180 // This is for codecs not using get_buffer to initialize | 193 // This is for codecs not using get_buffer to initialize |
| 181 // |av_frame_->reordered_opaque| | 194 // |av_frame_->reordered_opaque| |
| 182 av_frame_->reordered_opaque = codec_context_->reordered_opaque; | 195 av_frame_->reordered_opaque = codec_context_->reordered_opaque; |
| 183 | 196 |
| 184 int frame_decoded = 0; | 197 int frame_decoded = 0; |
| 185 int result = avcodec_decode_video2(codec_context_, | 198 int result = avcodec_decode_video2(codec_context_, |
| 186 av_frame_.get(), | 199 av_frame_.get(), |
| 187 &frame_decoded, | 200 &frame_decoded, |
| 188 &packet); | 201 &packet); |
| 189 | |
| 190 // Log the problem if we can't decode a video frame and exit early. | 202 // Log the problem if we can't decode a video frame and exit early. |
| 191 if (result < 0) { | 203 if (result < 0) { |
| 192 LOG(ERROR) << "Error decoding a video frame with timestamp: " | 204 LOG(ERROR) << "Error decoding a video frame with timestamp: " |
| 193 << buffer->GetTimestamp().InMicroseconds() << " us, duration: " | 205 << buffer->GetTimestamp().InMicroseconds() << " us, duration: " |
| 194 << buffer->GetDuration().InMicroseconds() << " us, packet size: " | 206 << buffer->GetDuration().InMicroseconds() << " us, packet size: " |
| 195 << buffer->GetDataSize() << " bytes"; | 207 << buffer->GetDataSize() << " bytes"; |
| 196 event_handler_->OnError(); | 208 event_handler_->OnError(); |
| 197 return; | 209 return; |
| 198 } | 210 } |
| 199 | 211 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 296 | 308 |
| 297 event_handler_->OnSeekComplete(); | 309 event_handler_->OnSeekComplete(); |
| 298 } | 310 } |
| 299 | 311 |
| 300 void FFmpegVideoDecodeEngine::ReadInput() { | 312 void FFmpegVideoDecodeEngine::ReadInput() { |
| 301 DCHECK_EQ(output_eos_reached_, false); | 313 DCHECK_EQ(output_eos_reached_, false); |
| 302 pending_input_buffers_++; | 314 pending_input_buffers_++; |
| 303 event_handler_->ProduceVideoSample(NULL); | 315 event_handler_->ProduceVideoSample(NULL); |
| 304 } | 316 } |
| 305 | 317 |
| 306 VideoFrame::Format FFmpegVideoDecodeEngine::GetSurfaceFormat() const { | |
| 307 // J (Motion JPEG) versions of YUV are full range 0..255. | |
| 308 // Regular (MPEG) YUV is 16..240. | |
| 309 // For now we will ignore the distinction and treat them the same. | |
| 310 switch (codec_context_->pix_fmt) { | |
| 311 case PIX_FMT_YUV420P: | |
| 312 case PIX_FMT_YUVJ420P: | |
| 313 return VideoFrame::YV12; | |
| 314 case PIX_FMT_YUV422P: | |
| 315 case PIX_FMT_YUVJ422P: | |
| 316 return VideoFrame::YV16; | |
| 317 default: | |
| 318 // TODO(scherkus): More formats here? | |
| 319 break; | |
| 320 } | |
| 321 return VideoFrame::INVALID; | |
| 322 } | |
| 323 | |
| 324 } // namespace media | 318 } // namespace media |
| 325 | 319 |
| 326 // Disable refcounting for this object because this object only lives | 320 // Disable refcounting for this object because this object only lives |
| 327 // on the video decoder thread and there's no need to refcount it. | 321 // on the video decoder thread and there's no need to refcount it. |
| 328 DISABLE_RUNNABLE_METHOD_REFCOUNT(media::FFmpegVideoDecodeEngine); | 322 DISABLE_RUNNABLE_METHOD_REFCOUNT(media::FFmpegVideoDecodeEngine); |
| OLD | NEW |