OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "content/renderer/media/rtc_video_encoder.h" | 5 #include "content/renderer/media/rtc_video_encoder.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/location.h" | 8 #include "base/location.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/scoped_vector.h" | 10 #include "base/memory/scoped_vector.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
55 header->VerifyAndAllocateFragmentationHeader(nalu_vector.size()); | 55 header->VerifyAndAllocateFragmentationHeader(nalu_vector.size()); |
56 for (size_t i = 0; i < nalu_vector.size(); ++i) { | 56 for (size_t i = 0; i < nalu_vector.size(); ++i) { |
57 header->fragmentationOffset[i] = nalu_vector[i].data - data; | 57 header->fragmentationOffset[i] = nalu_vector[i].data - data; |
58 header->fragmentationLength[i] = nalu_vector[i].size; | 58 header->fragmentationLength[i] = nalu_vector[i].size; |
59 header->fragmentationPlType[i] = 0; | 59 header->fragmentationPlType[i] = 0; |
60 header->fragmentationTimeDiff[i] = 0; | 60 header->fragmentationTimeDiff[i] = 0; |
61 } | 61 } |
62 return true; | 62 return true; |
63 } | 63 } |
64 | 64 |
65 // Maps webrtc::VideoCodecProfile to media::VideoCodecProfile for H264 codec. | |
Pawel Osciak
2014/10/20 06:28:43
Could we instead have a method that takes both pro
hshi1
2014/10/20 16:55:50
The |profile_| is of media::VideoCodecProfile type
Pawel Osciak
2014/10/21 13:41:46
Yes. My suggestion though was that it would be nic
hshi1
2014/10/22 19:01:16
Done.
| |
66 media::VideoCodecProfile GetH264CodecProfile( | |
67 webrtc::VideoCodecProfile profile) { | |
68 switch (profile) { | |
69 case webrtc::kProfileBase: | |
70 return media::H264PROFILE_BASELINE; | |
Pawel Osciak
2014/10/20 06:28:43
Is this actually baseline or constrained baseline?
hshi1
2014/10/20 16:55:50
This is the actual baseline, however as I commente
Pawel Osciak
2014/10/21 13:41:46
The issue is, what if an encoder does non-constrai
hshi1
2014/10/22 19:01:16
But there's no constrained baseline profile defini
Pawel Osciak
2014/10/25 01:29:57
Right, but that's a bug (crbug.com/345569) so perh
| |
71 case webrtc::kProfileMain: | |
72 return media::H264PROFILE_MAIN; | |
73 default: | |
74 DLOG(ERROR) << "Unrecognized H264 video codec profile"; | |
75 } | |
76 return media::H264PROFILE_BASELINE; | |
Pawel Osciak
2014/10/20 06:28:43
notreached.
hshi1
2014/10/20 16:55:50
Acknowledged.
| |
77 } | |
78 | |
65 } // namespace | 79 } // namespace |
66 | 80 |
67 // This private class of RTCVideoEncoder does the actual work of communicating | 81 // This private class of RTCVideoEncoder does the actual work of communicating |
68 // with a media::VideoEncodeAccelerator for handling video encoding. It can | 82 // with a media::VideoEncodeAccelerator for handling video encoding. It can |
69 // be created on any thread, but should subsequently be posted to (and Destroy() | 83 // be created on any thread, but should subsequently be posted to (and Destroy() |
70 // called on) a single thread. Callbacks to RTCVideoEncoder are posted to the | 84 // called on) a single thread. Callbacks to RTCVideoEncoder are posted to the |
71 // thread on which the instance was constructed. | 85 // thread on which the instance was constructed. |
72 // | 86 // |
73 // This class separates state related to the thread that RTCVideoEncoder | 87 // This class separates state related to the thread that RTCVideoEncoder |
74 // operates on (presently the libjingle worker thread) from the thread that | 88 // operates on (presently the libjingle worker thread) from the thread that |
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
567 int32_t RTCVideoEncoder::InitEncode(const webrtc::VideoCodec* codec_settings, | 581 int32_t RTCVideoEncoder::InitEncode(const webrtc::VideoCodec* codec_settings, |
568 int32_t number_of_cores, | 582 int32_t number_of_cores, |
569 uint32_t max_payload_size) { | 583 uint32_t max_payload_size) { |
570 DVLOG(1) << "InitEncode(): codecType=" << codec_settings->codecType | 584 DVLOG(1) << "InitEncode(): codecType=" << codec_settings->codecType |
571 << ", width=" << codec_settings->width | 585 << ", width=" << codec_settings->width |
572 << ", height=" << codec_settings->height | 586 << ", height=" << codec_settings->height |
573 << ", startBitrate=" << codec_settings->startBitrate; | 587 << ", startBitrate=" << codec_settings->startBitrate; |
574 DCHECK(thread_checker_.CalledOnValidThread()); | 588 DCHECK(thread_checker_.CalledOnValidThread()); |
575 DCHECK(!impl_.get()); | 589 DCHECK(!impl_.get()); |
576 | 590 |
591 if (codec_settings->codecType == webrtc::kVideoCodecH264) { | |
Pawel Osciak
2014/10/20 06:28:43
If we can't determine profile on construction, can
hshi1
2014/10/20 16:55:50
No we can't because of the way webRTC defines the
Pawel Osciak
2014/10/21 13:41:46
We could perhaps store webrtc codec in RTCVE const
hshi1
2014/10/22 19:01:16
Done.
| |
592 video_codec_profile_ = | |
593 GetH264CodecProfile(codec_settings->codecSpecific.H264.profile); | |
594 } | |
595 | |
577 weak_factory_.InvalidateWeakPtrs(); | 596 weak_factory_.InvalidateWeakPtrs(); |
578 impl_ = new Impl(weak_factory_.GetWeakPtr(), gpu_factories_); | 597 impl_ = new Impl(weak_factory_.GetWeakPtr(), gpu_factories_); |
579 base::WaitableEvent initialization_waiter(true, false); | 598 base::WaitableEvent initialization_waiter(true, false); |
580 int32_t initialization_retval = WEBRTC_VIDEO_CODEC_UNINITIALIZED; | 599 int32_t initialization_retval = WEBRTC_VIDEO_CODEC_UNINITIALIZED; |
581 gpu_factories_->GetTaskRunner()->PostTask( | 600 gpu_factories_->GetTaskRunner()->PostTask( |
582 FROM_HERE, | 601 FROM_HERE, |
583 base::Bind(&RTCVideoEncoder::Impl::CreateAndInitializeVEA, | 602 base::Bind(&RTCVideoEncoder::Impl::CreateAndInitializeVEA, |
584 impl_, | 603 impl_, |
585 gfx::Size(codec_settings->width, codec_settings->height), | 604 gfx::Size(codec_settings->width, codec_settings->height), |
586 codec_settings->startBitrate, | 605 codec_settings->startBitrate, |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
749 UMA_HISTOGRAM_BOOLEAN("Media.RTCVideoEncoderInitEncodeSuccess", | 768 UMA_HISTOGRAM_BOOLEAN("Media.RTCVideoEncoderInitEncodeSuccess", |
750 init_retval == WEBRTC_VIDEO_CODEC_OK); | 769 init_retval == WEBRTC_VIDEO_CODEC_OK); |
751 if (init_retval == WEBRTC_VIDEO_CODEC_OK) { | 770 if (init_retval == WEBRTC_VIDEO_CODEC_OK) { |
752 UMA_HISTOGRAM_ENUMERATION("Media.RTCVideoEncoderProfile", | 771 UMA_HISTOGRAM_ENUMERATION("Media.RTCVideoEncoderProfile", |
753 video_codec_profile_, | 772 video_codec_profile_, |
754 media::VIDEO_CODEC_PROFILE_MAX + 1); | 773 media::VIDEO_CODEC_PROFILE_MAX + 1); |
755 } | 774 } |
756 } | 775 } |
757 | 776 |
758 } // namespace content | 777 } // namespace content |
OLD | NEW |