OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 * | 9 * |
10 */ | 10 */ |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 av_frame->data[kUPlaneIndex] = frame_buffer->MutableDataU(); | 149 av_frame->data[kUPlaneIndex] = frame_buffer->MutableDataU(); |
150 av_frame->linesize[kUPlaneIndex] = frame_buffer->StrideU(); | 150 av_frame->linesize[kUPlaneIndex] = frame_buffer->StrideU(); |
151 av_frame->data[kVPlaneIndex] = frame_buffer->MutableDataV(); | 151 av_frame->data[kVPlaneIndex] = frame_buffer->MutableDataV(); |
152 av_frame->linesize[kVPlaneIndex] = frame_buffer->StrideV(); | 152 av_frame->linesize[kVPlaneIndex] = frame_buffer->StrideV(); |
153 RTC_DCHECK_EQ(av_frame->extended_data, av_frame->data); | 153 RTC_DCHECK_EQ(av_frame->extended_data, av_frame->data); |
154 | 154 |
155 // Create a VideoFrame object, to keep a reference to the buffer. | 155 // Create a VideoFrame object, to keep a reference to the buffer. |
156 // TODO(nisse): The VideoFrame's timestamp and rotation info is not used. | 156 // TODO(nisse): The VideoFrame's timestamp and rotation info is not used. |
157 // Refactor to do not use a VideoFrame object at all. | 157 // Refactor to do not use a VideoFrame object at all. |
158 av_frame->buf[0] = av_buffer_create( | 158 av_frame->buf[0] = av_buffer_create( |
159 av_frame->data[kYPlaneIndex], | 159 av_frame->data[kYPlaneIndex], total_size, AVFreeBuffer2, |
160 total_size, | 160 static_cast<void*>(new VideoFrame( |
161 AVFreeBuffer2, | 161 frame_buffer, 0 /* timestamp */, 0 /* render_time_ms */, |
162 static_cast<void*>(new VideoFrame(frame_buffer, | 162 kVideoRotation_0, VideoContentType::kDefault)), |
163 0 /* timestamp */, | |
164 0 /* render_time_ms */, | |
165 kVideoRotation_0)), | |
166 0); | 163 0); |
167 RTC_CHECK(av_frame->buf[0]); | 164 RTC_CHECK(av_frame->buf[0]); |
168 return 0; | 165 return 0; |
169 } | 166 } |
170 | 167 |
171 void H264DecoderImpl::AVFreeBuffer2(void* opaque, uint8_t* data) { | 168 void H264DecoderImpl::AVFreeBuffer2(void* opaque, uint8_t* data) { |
172 // The buffer pool recycles the buffer used by |video_frame| when there are no | 169 // The buffer pool recycles the buffer used by |video_frame| when there are no |
173 // more references to it. |video_frame| is a thin buffer holder and is not | 170 // more references to it. |video_frame| is a thin buffer holder and is not |
174 // recycled. | 171 // recycled. |
175 VideoFrame* video_frame = static_cast<VideoFrame*>(opaque); | 172 VideoFrame* video_frame = static_cast<VideoFrame*>(opaque); |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 if (av_frame_->width != buf->width() || av_frame_->height != buf->height()) { | 370 if (av_frame_->width != buf->width() || av_frame_->height != buf->height()) { |
374 rtc::scoped_refptr<VideoFrameBuffer> cropped_buf( | 371 rtc::scoped_refptr<VideoFrameBuffer> cropped_buf( |
375 new rtc::RefCountedObject<WrappedI420Buffer>( | 372 new rtc::RefCountedObject<WrappedI420Buffer>( |
376 av_frame_->width, av_frame_->height, | 373 av_frame_->width, av_frame_->height, |
377 buf->DataY(), buf->StrideY(), | 374 buf->DataY(), buf->StrideY(), |
378 buf->DataU(), buf->StrideU(), | 375 buf->DataU(), buf->StrideU(), |
379 buf->DataV(), buf->StrideV(), | 376 buf->DataV(), buf->StrideV(), |
380 rtc::KeepRefUntilDone(buf))); | 377 rtc::KeepRefUntilDone(buf))); |
381 VideoFrame cropped_frame( | 378 VideoFrame cropped_frame( |
382 cropped_buf, video_frame->timestamp(), video_frame->render_time_ms(), | 379 cropped_buf, video_frame->timestamp(), video_frame->render_time_ms(), |
383 video_frame->rotation()); | 380 video_frame->rotation(), video_frame->content_type()); |
384 // TODO(nisse): Timestamp and rotation are all zero here. Change decoder | 381 // TODO(nisse): Timestamp and rotation are all zero here. Change decoder |
385 // interface to pass a VideoFrameBuffer instead of a VideoFrame? | 382 // interface to pass a VideoFrameBuffer instead of a VideoFrame? |
386 decoded_image_callback_->Decoded(cropped_frame, rtc::Optional<int32_t>(), | 383 decoded_image_callback_->Decoded(cropped_frame, rtc::Optional<int32_t>(), |
387 qp); | 384 qp); |
388 } else { | 385 } else { |
389 // Return decoded frame. | 386 // Return decoded frame. |
390 decoded_image_callback_->Decoded(*video_frame, rtc::Optional<int32_t>(), | 387 decoded_image_callback_->Decoded(*video_frame, rtc::Optional<int32_t>(), |
391 qp); | 388 qp); |
392 } | 389 } |
393 // Stop referencing it, possibly freeing |video_frame|. | 390 // Stop referencing it, possibly freeing |video_frame|. |
(...skipping 23 matching lines...) Expand all Loading... |
417 void H264DecoderImpl::ReportError() { | 414 void H264DecoderImpl::ReportError() { |
418 if (has_reported_error_) | 415 if (has_reported_error_) |
419 return; | 416 return; |
420 RTC_HISTOGRAM_ENUMERATION("WebRTC.Video.H264DecoderImpl.Event", | 417 RTC_HISTOGRAM_ENUMERATION("WebRTC.Video.H264DecoderImpl.Event", |
421 kH264DecoderEventError, | 418 kH264DecoderEventError, |
422 kH264DecoderEventMax); | 419 kH264DecoderEventMax); |
423 has_reported_error_ = true; | 420 has_reported_error_ = true; |
424 } | 421 } |
425 | 422 |
426 } // namespace webrtc | 423 } // namespace webrtc |
OLD | NEW |