Changeset 236466 in webkit
- Timestamp:
- Sep 25, 2018, 11:41:07 AM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
platform/mediastream/libwebrtc/GStreamerVideoDecoderFactory.cpp (modified) (1 diff)
-
platform/mediastream/libwebrtc/GStreamerVideoEncoderFactory.cpp (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r236465 r236466 1 2018-09-25 Thibault Saunier <tsaunier@igalia.com> 2 3 [WPE][GTK][WebRTC] Fixup VP8 encoding support 4 https://bugs.webkit.org/show_bug.cgi?id=189921 5 6 Previous leak fixing commit introduced a regression in 7 the way the encoded buffer were prepared in the default 8 GStreamerVideoEncoder::Fragmentize implementation (when 9 encoding with VP8 basically). 10 11 + Fix a build warning in the decoder. 12 + Fix some wrong object members namings. 13 + Properly move the caps reference when setting restriction caps. 14 + Do not raise a GStreamer error when GStreamerVideoEncoder::OnEncodedImage 15 fails - this might be a network issue and other encoders do not consider that 16 fatal. 17 + Use GstMappedBuffer where appropriate. 18 19 Reviewed by Philippe Normand. 20 21 * platform/mediastream/libwebrtc/GStreamerVideoDecoderFactory.cpp: 22 * platform/mediastream/libwebrtc/GStreamerVideoEncoderFactory.cpp: 23 (WebCore::GStreamerVideoEncoder::InitEncode): 24 (WebCore::GStreamerVideoEncoder::newSampleCallback): 25 (WebCore::GStreamerVideoEncoder::Fragmentize): 26 (WebCore::GStreamerVideoEncoder::SetRestrictionCaps): 27 1 28 2018-09-25 Eric Carlson <eric.carlson@apple.com> 2 29 -
trunk/Source/WebCore/platform/mediastream/libwebrtc/GStreamerVideoDecoderFactory.cpp
r236397 r236466 166 166 m_dtsPtsMap[GST_BUFFER_PTS(buffer.get())] = inputImage._timeStamp; 167 167 168 GST_LOG_OBJECT(pipeline(), "%ld Decoding: %" GST_PTR_FORMAT, renderTimeMs, buffer );168 GST_LOG_OBJECT(pipeline(), "%ld Decoding: %" GST_PTR_FORMAT, renderTimeMs, buffer.get()); 169 169 auto sample = adoptGRef(gst_sample_new(buffer.get(), GetCapsForFrame(inputImage), nullptr, nullptr)); 170 170 switch (gst_app_src_push_sample(GST_APP_SRC(m_src), sample.get())) { -
trunk/Source/WebCore/platform/mediastream/libwebrtc/GStreamerVideoEncoderFactory.cpp
r236397 r236466 82 82 gst_caps_set_simple(caps.get(), "framerate", GST_TYPE_FRACTION, frameRate, 1, nullptr); 83 83 84 SetRestrictionCaps( caps);84 SetRestrictionCaps(WTFMove(caps)); 85 85 86 86 if (m_bitrateSetter && m_encoder) … … 110 110 m_encodedFrame._size = codecSettings->width * codecSettings->height * 3; 111 111 m_encodedFrame._buffer = new uint8_t[m_encodedFrame._size]; 112 encoded_image_buffer_.reset(m_encodedFrame._buffer);112 m_encodedImageBuffer.reset(m_encodedFrame._buffer); 113 113 m_encodedFrame._completeFrame = true; 114 114 m_encodedFrame._encodedWidth = 0; … … 160 160 { 161 161 m_encodedFrame._buffer = nullptr; 162 encoded_image_buffer_.reset();162 m_encodedImageBuffer.reset(); 163 163 GRefPtr<GstBus> bus = adoptGRef(gst_pipeline_get_bus(GST_PIPELINE(m_pipeline.get()))); 164 164 gst_bus_set_sync_handler(bus.get(), nullptr, nullptr, nullptr); … … 231 231 232 232 webrtc::RTPFragmentationHeader fragmentationInfo; 233 Fragmentize(&m_encodedFrame, & encoded_image_buffer_, buffer, &fragmentationInfo);233 Fragmentize(&m_encodedFrame, &m_encodedImageBuffer, &m_encodedImageBufferSize, buffer, &fragmentationInfo); 234 234 if (!m_encodedFrame._size) 235 235 return GST_FLOW_OK; … … 250 250 251 251 webrtc::EncodedImageCallback::Result result = m_imageReadyCb->OnEncodedImage(m_encodedFrame, &codecSpecifiInfos, &fragmentationInfo); 252 if (result.error != webrtc::EncodedImageCallback::Result::OK) { 253 GST_ELEMENT_ERROR(m_pipeline.get(), LIBRARY, FAILED, (nullptr), 254 ("Encode callback failed: %d", result.error)); 255 256 return GST_FLOW_ERROR; 257 } 252 if (result.error != webrtc::EncodedImageCallback::Result::OK) 253 GST_ERROR_OBJECT(m_pipeline.get(), "Encode callback failed: %d", result.error); 258 254 259 255 return GST_FLOW_OK; … … 360 356 virtual void PopulateCodecSpecific(webrtc::CodecSpecificInfo*, GstBuffer*) = 0; 361 357 362 virtual void Fragmentize(webrtc::EncodedImage* encodedImage, std::unique_ptr<uint8_t[]>* encoded_image_buffer, GstBuffer* buffer, 363 webrtc::RTPFragmentationHeader* fragmentationInfo) 364 { 365 GstMapInfo map; 366 367 gst_buffer_map(buffer, &map, GST_MAP_READ); 368 if (encodedImage->_size < map.size) { 369 encodedImage->_size = map.size; 358 virtual void Fragmentize(webrtc::EncodedImage* encodedImage, std::unique_ptr<uint8_t[]>* encodedImageBuffer, 359 size_t* bufferSize, GstBuffer* buffer, webrtc::RTPFragmentationHeader* fragmentationInfo) 360 { 361 GstMappedBuffer map(buffer, GST_MAP_READ); 362 363 if (*bufferSize < map.size()) { 364 encodedImage->_size = map.size(); 370 365 encodedImage->_buffer = new uint8_t[encodedImage->_size]; 371 encoded_image_buffer->reset(encodedImage->_buffer); 372 memcpy(encodedImage->_buffer, map.data, map.size); 373 } 374 gst_buffer_unmap(buffer, &map); 366 encodedImageBuffer->reset(encodedImage->_buffer); 367 *bufferSize = map.size(); 368 } 369 370 memcpy(encodedImage->_buffer, map.data(), map.size()); 371 encodedImage->_length = map.size(); 372 encodedImage->_size = map.size(); 375 373 376 374 fragmentationInfo->VerifyAndAllocateFragmentationHeader(1); 377 375 fragmentationInfo->fragmentationOffset[0] = 0; 378 fragmentationInfo->fragmentationLength[0] = gst_buffer_get_size(buffer);376 fragmentationInfo->fragmentationLength[0] = map.size(); 379 377 fragmentationInfo->fragmentationPlType[0] = 0; 380 378 fragmentationInfo->fragmentationTimeDiff[0] = 0; … … 393 391 { 394 392 if (caps && m_profile.get() && gst_caps_is_equal(m_restrictionCaps.get(), caps.get())) 395 g_object_set(m_profile.get(), "restriction-caps", caps , nullptr);393 g_object_set(m_profile.get(), "restriction-caps", caps.get(), nullptr); 396 394 397 395 m_restrictionCaps = caps; … … 414 412 BitrateSetter m_bitrateSetter; 415 413 webrtc::EncodedImage m_encodedFrame; 416 std::unique_ptr<uint8_t[]> encoded_image_buffer_; 414 std::unique_ptr<uint8_t[]> m_encodedImageBuffer; 415 size_t m_encodedImageBufferSize; 417 416 }; 418 417 … … 432 431 433 432 // FIXME - MT. safety! 434 void Fragmentize(webrtc::EncodedImage* encodedImage, std::unique_ptr<uint8_t[]>* encoded _image_buffer,433 void Fragmentize(webrtc::EncodedImage* encodedImage, std::unique_ptr<uint8_t[]>* encodedImageBuffer, size_t *bufferSize, 435 434 GstBuffer* gstbuffer, webrtc::RTPFragmentationHeader* fragmentationHeader) final 436 435 { 437 GstMapInfo map;438 436 GstH264NalUnit nalu; 439 437 auto parserResult = GST_H264_PARSER_OK; … … 445 443 446 444 const uint8_t startCode[4] = { 0, 0, 0, 1 }; 447 gst_buffer_map(gstbuffer, &map, GST_MAP_READ);445 GstMappedBuffer map(gstbuffer, GST_MAP_READ); 448 446 while (parserResult == GST_H264_PARSER_OK) { 449 parserResult = gst_h264_parser_identify_nalu(m_parser, map.data , offset, map.size, &nalu);447 parserResult = gst_h264_parser_identify_nalu(m_parser, map.data(), offset, map.size(), &nalu); 450 448 451 449 nalu.sc_offset = offset; … … 462 460 encodedImage->_size = requiredSize; 463 461 encodedImage->_buffer = new uint8_t[encodedImage->_size]; 464 encoded_image_buffer->reset(encodedImage->_buffer); 462 encodedImageBuffer->reset(encodedImage->_buffer); 463 *bufferSize = map.size(); 465 464 } 466 465 … … 471 470 for (std::vector<GstH264NalUnit>::iterator nal = nals.begin(); nal != nals.end(); ++nal, fragmentIndex++) { 472 471 473 ASSERT(map.data [nal->sc_offset + 0] == startCode[0]);474 ASSERT(map.data [nal->sc_offset + 1] == startCode[1]);475 ASSERT(map.data [nal->sc_offset + 2] == startCode[2]);476 ASSERT(map.data [nal->sc_offset + 3] == startCode[3]);472 ASSERT(map.data()[nal->sc_offset + 0] == startCode[0]); 473 ASSERT(map.data()[nal->sc_offset + 1] == startCode[1]); 474 ASSERT(map.data()[nal->sc_offset + 2] == startCode[2]); 475 ASSERT(map.data()[nal->sc_offset + 3] == startCode[3]); 477 476 478 477 fragmentationHeader->fragmentationOffset[fragmentIndex] = nal->offset; 479 478 fragmentationHeader->fragmentationLength[fragmentIndex] = nal->size; 480 479 481 memcpy(encodedImage->_buffer + encodedImage->_length, &map.data [nal->sc_offset],480 memcpy(encodedImage->_buffer + encodedImage->_length, &map.data()[nal->sc_offset], 482 481 sizeof(startCode) + nal->size); 483 482 encodedImage->_length += nal->size + sizeof(startCode); 484 483 } 485 486 gst_buffer_unmap(gstbuffer, &map);487 484 } 488 485
Note:
See TracChangeset
for help on using the changeset viewer.