Changeset 287613 in webkit
- Timestamp:
- Jan 5, 2022 3:26:48 AM (7 months ago)
- Location:
- trunk
- Files:
-
- 2 added
- 9 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/http/wpt/mediarecorder/MediaRecorder-bitrate-expected.txt (added)
-
LayoutTests/http/wpt/mediarecorder/MediaRecorder-bitrate.html (added)
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-bitrate.https-expected.txt (modified) (2 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp (modified) (4 diffs)
-
Source/WebCore/Modules/mediarecorder/MediaRecorder.h (modified) (4 diffs)
-
Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.cpp (modified) (2 diffs)
-
Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.h (modified) (1 diff)
-
Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r287612 r287613 1 2022-01-05 Youenn Fablet <youenn@apple.com> 2 3 MediaRecorder should support the bitsPerSecond option 4 https://bugs.webkit.org/show_bug.cgi?id=234784 5 6 Reviewed by Darin Adler. 7 8 * http/wpt/mediarecorder/MediaRecorder-bitrate-expected.txt: Added. 9 * http/wpt/mediarecorder/MediaRecorder-bitrate.html: Added. 10 1 11 2022-01-05 Youenn Fablet <youenn@apple.com> 2 12 -
trunk/LayoutTests/imported/w3c/ChangeLog
r287612 r287613 1 2022-01-05 Youenn Fablet <youenn@apple.com> 2 3 MediaRecorder should support the bitsPerSecond option 4 https://bugs.webkit.org/show_bug.cgi?id=234784 5 6 Reviewed by Darin Adler. 7 8 * web-platform-tests/mediacapture-record/MediaRecorder-bitrate.https-expected.txt: 9 1 10 2022-01-05 Youenn Fablet <youenn@apple.com> 2 11 -
trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-bitrate.https-expected.txt
r268363 r287613 1 1 2 2 PASS Passing no bitrate config results in defaults 3 FAIL Passing bitsPerSecond:0 results in targets close to 0 assert_approx_equals: expected 0 +/- 100000 but got 101920003 PASS Passing bitsPerSecond:0 results in targets close to 0 4 4 PASS Passing only audioBitsPerSecond:0 results in 0 for audio, default for video 5 5 PASS Passing only videoBitsPerSecond:0 results in 0 for video, default for audio 6 FAIL Passing bitsPerSecond:0 overrides audio/video-specific values assert_approx_equals: expected 0 +/- 100000 but got 1100000 7 FAIL Passing bitsPerSecond overrides audio/video zero values assert_not_equals: got disallowed value 0 8 FAIL Passing bitsPerSecond sets audio/video bitrate values assert_approx_equals: expected 2000000 +/- 100000 but got 10192000 6 PASS Passing bitsPerSecond:0 overrides audio/video-specific values 7 PASS Passing bitsPerSecond overrides audio/video zero values 8 PASS Passing bitsPerSecond sets audio/video bitrate values 9 9 PASS Passing only audioBitsPerSecond results in default for video 10 10 PASS Passing only videoBitsPerSecond results in default for audio … … 16 16 PASS Passed-in track bitrates are not changed by start() 17 17 PASS Passing bitsPerSecond for audio/video stream does not change track bitrates in start() 18 FAIL Passing bitsPerSecond for audio stream sets video track bitrate to 0 in start() assert_approx_equals: expected 500000 +/- 100000 but got 192000 19 FAIL Passing bitsPerSecond for video stream sets audio track bitrate to 0 in start() assert_equals: expected 0 but got 192000 18 PASS Passing bitsPerSecond for audio stream sets video track bitrate to 0 in start() 19 PASS Passing bitsPerSecond for video stream sets audio track bitrate to 0 in start() 20 20 -
trunk/Source/WebCore/ChangeLog
r287612 r287613 1 2022-01-05 Youenn Fablet <youenn@apple.com> 2 3 MediaRecorder should support the bitsPerSecond option 4 https://bugs.webkit.org/show_bug.cgi?id=234784 5 6 Reviewed by Darin Adler. 7 8 In case bitsPerSecond is set, we now compute audioBitsPerSecond and videoBitsPerSecond value according to it. 9 We set audioBitsPerSecond to a tenth of bitsPerSecond and set videoBitsPerSecond to the remaining available bandwidth. 10 We then use minimum values of 8kbps for audio and 80kbps for video. 11 As per spec, we compute these values at creation, start and stop times. 12 We introduce dedicated class members for audio and video bitrates, similarly to the spec defining corresponding slots. 13 14 Test: http/wpt/mediarecorder/MediaRecorder-bitrate.html 15 16 * Modules/mediarecorder/MediaRecorder.cpp: 17 * Modules/mediarecorder/MediaRecorder.h: 18 * platform/mediarecorder/MediaRecorderPrivate.cpp: 19 * platform/mediarecorder/MediaRecorderPrivate.h: 20 * platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp: 21 1 22 2022-01-05 Youenn Fablet <youenn@apple.com> 2 23 -
trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp
r287021 r287613 104 104 , m_timeSliceTimer([this] { requestData(); }) 105 105 { 106 MediaRecorderPrivate::updateOptions(m_options);106 computeInitialBitRates(); 107 107 108 108 m_tracks = WTF::map(m_stream->getTracks(), [] (auto&& track) -> Ref<MediaStreamTrackPrivate> { … … 155 155 return Exception { InvalidStateError, "The MediaRecorder's state must be inactive in order to start recording"_s }; 156 156 157 updateBitRates(); 158 159 Options options; 160 options.audioBitsPerSecond = m_audioBitsPerSecond; 161 options.videoBitsPerSecond = m_videoBitsPerSecond; 162 157 163 ASSERT(!m_private); 158 auto result = createMediaRecorderPrivate(*document(), m_stream->privateStream(), m_options);164 auto result = createMediaRecorderPrivate(*document(), m_stream->privateStream(), options); 159 165 160 166 if (result.hasException()) … … 208 214 return; 209 215 216 updateBitRates(); 217 210 218 stopRecordingInternal(); 211 219 fetchData([this](auto&& buffer, auto& mimeType, auto timeCode) { … … 394 402 } 395 403 404 void MediaRecorder::computeBitRates(const MediaStreamPrivate* stream) 405 { 406 auto bitRates = MediaRecorderPrivate::computeBitRates(m_options, stream); 407 m_audioBitsPerSecond = bitRates.audio; 408 m_videoBitsPerSecond = bitRates.video; 409 } 410 396 411 } // namespace WebCore 397 412 -
trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h
r287021 r287613 76 76 ExceptionOr<void> resumeRecording(); 77 77 78 unsigned videoBitsPerSecond() const { return m_ options.videoBitsPerSecond.value_or(0); }79 unsigned audioBitsPerSecond() const { return m_ options.audioBitsPerSecond.value_or(0); }78 unsigned videoBitsPerSecond() const { return m_videoBitsPerSecond; } 79 unsigned audioBitsPerSecond() const { return m_audioBitsPerSecond; } 80 80 81 81 MediaStream& stream() { return m_stream.get(); } … … 100 100 bool virtualHasPendingActivity() const final; 101 101 102 void stopRecordingInternal(CompletionHandler<void()>&& = [] { });102 void stopRecordingInternal(CompletionHandler<void()>&& = [] { }); 103 103 void dispatchError(Exception&&); 104 104 … … 119 119 void trackSettingsChanged(MediaStreamTrackPrivate&) final { }; 120 120 121 void computeInitialBitRates() { computeBitRates(nullptr); } 122 void updateBitRates() { computeBitRates(&m_stream->privateStream()); } 123 void computeBitRates(const MediaStreamPrivate*); 124 121 125 static CreatorFunction m_customCreator; 122 126 … … 132 136 bool m_isFetchingData { false }; 133 137 Deque<FetchDataCallback> m_pendingFetchDataTasks; 138 139 unsigned m_audioBitsPerSecond { 0 }; 140 unsigned m_videoBitsPerSecond { 0 }; 134 141 }; 135 142 -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.cpp
r272200 r287613 33 33 namespace WebCore { 34 34 35 constexpr unsigned SmallAudioBitRate = 8000; 36 constexpr unsigned SmallVideoBitRate = 80000; 35 37 constexpr unsigned LargeAudioBitRate = 192000; 36 38 constexpr unsigned LargeVideoBitRate = 10000000; … … 101 103 } 102 104 103 void MediaRecorderPrivate::updateOptions(MediaRecorderPrivateOptions& options)105 MediaRecorderPrivate::BitRates MediaRecorderPrivate::computeBitRates(const MediaRecorderPrivateOptions& options, const MediaStreamPrivate* stream) 104 106 { 105 // FIXME: Add support for options.bitsPerSecond. 106 if (!options.audioBitsPerSecond) 107 options.audioBitsPerSecond = LargeAudioBitRate; 108 if (!options.videoBitsPerSecond) 109 options.videoBitsPerSecond = LargeVideoBitRate; 107 if (options.bitsPerSecond) { 108 bool hasAudio = stream ? stream->hasAudio() : true; 109 bool hasVideo = stream ? stream->hasVideo() : true; 110 auto totalBitsPerSecond = *options.bitsPerSecond; 111 112 if (hasAudio && hasVideo) { 113 auto audioBitsPerSecond = std::min(LargeAudioBitRate, std::max(SmallAudioBitRate, totalBitsPerSecond / 10)); 114 auto remainingBitsPerSecond = totalBitsPerSecond > audioBitsPerSecond ? (totalBitsPerSecond - audioBitsPerSecond) : 0; 115 return { audioBitsPerSecond, std::max(remainingBitsPerSecond, SmallVideoBitRate) }; 116 } 117 118 if (hasAudio) 119 return { std::max(SmallAudioBitRate, totalBitsPerSecond), 0 }; 120 121 return { 0, std::max(SmallVideoBitRate, totalBitsPerSecond) }; 122 } 123 124 return { options.audioBitsPerSecond.value_or(LargeAudioBitRate), options.videoBitsPerSecond.value_or(LargeVideoBitRate) }; 110 125 } 111 126 -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.h
r287021 r287613 74 74 void trackEnabledChanged(MediaStreamTrackPrivate& track) { checkTrackState(track); } 75 75 76 static void updateOptions(MediaRecorderPrivateOptions&); 76 struct BitRates { 77 unsigned audio; 78 unsigned video; 79 }; 80 static BitRates computeBitRates(const MediaRecorderPrivateOptions&, const MediaStreamPrivate* = nullptr); 77 81 78 82 protected: -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp
r285984 r287613 80 80 { 81 81 // FIMXE: In case of of audio recording, we should wait for the audio compression to start to give back the exact bit rate. 82 // FIXME: Add support to options.bitsPerSecond as well.83 82 callback(String(m_writer->mimeType()), m_writer->audioBitRate(), m_writer->videoBitRate()); 84 83 }
Note: See TracChangeset
for help on using the changeset viewer.