Reland "Update RTCEncodedImage to not use deprecated mutable_data call."
This reverts commit 966bcc4bd5cc7aee5963e784ddf0caf668b2d6e6. Reason for revert: Fixing upstream issues. Original change's description: > Revert "Update RTCEncodedImage to not use deprecated mutable_data call." > > This reverts commit 677e62785dd39cbc730edcbb7ef99909dd292b11. > > Reason for revert: > The RTC_DCHECK_EQ(self.buffer.bytes, self.encodedData->data()) line is triggering for every call > > Original change's description: > > Update RTCEncodedImage to not use deprecated mutable_data call. > > > > Bug: webrtc:9378 > > Change-Id: If1e6284e2d11009097c87d15b98a2768a1d71521 > > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168524 > > Commit-Queue: Kári Helgason <kthelgason@webrtc.org> > > Reviewed-by: Niels Moller <nisse@webrtc.org> > > Cr-Commit-Position: refs/heads/master@{#30518} > > TBR=nisse@webrtc.org,kthelgason@webrtc.org > > # Not skipping CQ checks because original CL landed > 1 day ago. > > Bug: webrtc:9378 > Change-Id: I91b6df1148224785c209a7306ec186a952f5e289 > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168620 > Reviewed-by: Zeke Chin <tkchin@webrtc.org> > Commit-Queue: Zeke Chin <tkchin@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#30527} TBR=nisse@webrtc.org,kthelgason@webrtc.org,tkchin@webrtc.org # Not skipping CQ checks because original CL landed > 1 day ago. Bug: webrtc:9378 Change-Id: I1c0e61d8a390a5999f8dbbbda6f094d71f9b0678 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168740 Reviewed-by: Kári Helgason <kthelgason@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Commit-Queue: Kári Helgason <kthelgason@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30588}
This commit is contained in:
parent
d6e8e80883
commit
ecbdbf6ee8
@ -1063,6 +1063,7 @@ if (is_ios || is_mac) {
|
||||
"objc/unittests/ObjCVideoTrackSource_xctest.mm",
|
||||
"objc/unittests/RTCCVPixelBuffer_xctest.mm",
|
||||
"objc/unittests/RTCCallbackLogger_xctest.m",
|
||||
"objc/unittests/RTCEncodedImage_xctest.mm",
|
||||
"objc/unittests/RTCFileVideoCapturer_xctest.mm",
|
||||
"objc/unittests/RTCH264ProfileLevelId_xctest.m",
|
||||
"objc/unittests/RTCNV12TextureCache_xctest.m",
|
||||
@ -1084,6 +1085,7 @@ if (is_ios || is_mac) {
|
||||
deps = [
|
||||
":audio_device",
|
||||
":audio_session_objc",
|
||||
":base_native_additions_objc",
|
||||
":base_objc",
|
||||
":callback_logger_objc",
|
||||
":framework_objc",
|
||||
|
||||
@ -13,6 +13,29 @@
|
||||
#import <objc/runtime.h>
|
||||
|
||||
#include "rtc_base/numerics/safe_conversions.h"
|
||||
#include "rtc_base/ref_counted_object.h"
|
||||
|
||||
namespace {
|
||||
// An implementation of EncodedImageBufferInterface that doesn't perform any copies.
|
||||
class ObjCEncodedImageBuffer : public webrtc::EncodedImageBufferInterface {
|
||||
public:
|
||||
static rtc::scoped_refptr<ObjCEncodedImageBuffer> Create(NSData *data) {
|
||||
return new rtc::RefCountedObject<ObjCEncodedImageBuffer>(data);
|
||||
}
|
||||
const uint8_t *data() const override { return static_cast<const uint8_t *>(data_.bytes); }
|
||||
// TODO(bugs.webrtc.org/9378): delete this non-const data method.
|
||||
uint8_t *data() override {
|
||||
return const_cast<uint8_t *>(static_cast<const uint8_t *>(data_.bytes));
|
||||
}
|
||||
size_t size() const override { return data_.length; }
|
||||
|
||||
protected:
|
||||
explicit ObjCEncodedImageBuffer(NSData *data) : data_(data) {}
|
||||
~ObjCEncodedImageBuffer() {}
|
||||
|
||||
NSData *data_;
|
||||
};
|
||||
}
|
||||
|
||||
// A simple wrapper around webrtc::EncodedImageBufferInterface to make it usable with associated
|
||||
// objects.
|
||||
@ -51,9 +74,12 @@
|
||||
|
||||
- (instancetype)initWithNativeEncodedImage:(const webrtc::EncodedImage &)encodedImage {
|
||||
if (self = [super init]) {
|
||||
// A reference to the encodedData must be stored so that it's kept alive as long
|
||||
// self.buffer references its underlying data.
|
||||
self.encodedData = encodedImage.GetEncodedData();
|
||||
// Wrap the buffer in NSData without copying, do not take ownership.
|
||||
self.buffer = [NSData dataWithBytesNoCopy:encodedImage.mutable_data()
|
||||
length:encodedImage.size()
|
||||
self.buffer = [NSData dataWithBytesNoCopy:self.encodedData->data()
|
||||
length:self.encodedData->size()
|
||||
freeWhenDone:NO];
|
||||
self.encodedWidth = rtc::dchecked_cast<int32_t>(encodedImage._encodedWidth);
|
||||
self.encodedHeight = rtc::dchecked_cast<int32_t>(encodedImage._encodedHeight);
|
||||
@ -77,8 +103,13 @@
|
||||
|
||||
- (webrtc::EncodedImage)nativeEncodedImage {
|
||||
// Return the pointer without copying.
|
||||
webrtc::EncodedImage encodedImage(
|
||||
(uint8_t *)self.buffer.bytes, (size_t)self.buffer.length, (size_t)self.buffer.length);
|
||||
webrtc::EncodedImage encodedImage;
|
||||
if (self.encodedData) {
|
||||
encodedImage.SetEncodedData(self.encodedData);
|
||||
} else if (self.buffer) {
|
||||
encodedImage.SetEncodedData(ObjCEncodedImageBuffer::Create(self.buffer));
|
||||
}
|
||||
encodedImage.set_size(self.buffer.length);
|
||||
encodedImage._encodedWidth = rtc::dchecked_cast<uint32_t>(self.encodedWidth);
|
||||
encodedImage._encodedHeight = rtc::dchecked_cast<uint32_t>(self.encodedHeight);
|
||||
encodedImage.SetTimestamp(self.timeStamp);
|
||||
|
||||
54
sdk/objc/unittests/RTCEncodedImage_xctest.mm
Normal file
54
sdk/objc/unittests/RTCEncodedImage_xctest.mm
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright 2020 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "api/peerconnection/RTCEncodedImage+Private.h"
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
@interface RTCEncodedImageTests : XCTestCase
|
||||
@end
|
||||
|
||||
@implementation RTCEncodedImageTests
|
||||
|
||||
- (void)testInitializedWithNativeEncodedImage {
|
||||
const auto encoded_data = webrtc::EncodedImageBuffer::Create();
|
||||
webrtc::EncodedImage encoded_image;
|
||||
encoded_image.SetEncodedData(encoded_data);
|
||||
|
||||
RTCEncodedImage *encodedImage =
|
||||
[[RTCEncodedImage alloc] initWithNativeEncodedImage:encoded_image];
|
||||
|
||||
XCTAssertEqual([encodedImage nativeEncodedImage].GetEncodedData(), encoded_data);
|
||||
}
|
||||
|
||||
- (void)testInitWithNSData {
|
||||
NSData *bufferData = [NSData data];
|
||||
RTCEncodedImage *encodedImage = [[RTCEncodedImage alloc] init];
|
||||
encodedImage.buffer = bufferData;
|
||||
|
||||
webrtc::EncodedImage result_encoded_image = [encodedImage nativeEncodedImage];
|
||||
XCTAssertTrue(result_encoded_image.GetEncodedData() != nullptr);
|
||||
XCTAssertEqual(result_encoded_image.GetEncodedData()->data(), bufferData.bytes);
|
||||
}
|
||||
|
||||
- (void)testRetainsNativeEncodedImage {
|
||||
RTCEncodedImage *encodedImage;
|
||||
{
|
||||
const auto encoded_data = webrtc::EncodedImageBuffer::Create();
|
||||
webrtc::EncodedImage encoded_image;
|
||||
encoded_image.SetEncodedData(encoded_data);
|
||||
encodedImage = [[RTCEncodedImage alloc] initWithNativeEncodedImage:encoded_image];
|
||||
}
|
||||
webrtc::EncodedImage result_encoded_image = [encodedImage nativeEncodedImage];
|
||||
XCTAssertTrue(result_encoded_image.GetEncodedData() != nullptr);
|
||||
XCTAssertTrue(result_encoded_image.GetEncodedData()->data() != nullptr);
|
||||
}
|
||||
|
||||
@end
|
||||
@ -70,6 +70,7 @@ TEST(ObjCVideoDecoderFactoryTest, DecodeReturnsOKOnSuccess) {
|
||||
std::unique_ptr<webrtc::VideoDecoder> decoder = GetObjCDecoder(CreateOKDecoderFactory());
|
||||
|
||||
webrtc::EncodedImage encoded_image;
|
||||
encoded_image.SetEncodedData(webrtc::EncodedImageBuffer::Create());
|
||||
|
||||
EXPECT_EQ(decoder->Decode(encoded_image, false, 0), WEBRTC_VIDEO_CODEC_OK);
|
||||
}
|
||||
@ -78,6 +79,7 @@ TEST(ObjCVideoDecoderFactoryTest, DecodeReturnsErrorOnFail) {
|
||||
std::unique_ptr<webrtc::VideoDecoder> decoder = GetObjCDecoder(CreateErrorDecoderFactory());
|
||||
|
||||
webrtc::EncodedImage encoded_image;
|
||||
encoded_image.SetEncodedData(webrtc::EncodedImageBuffer::Create());
|
||||
|
||||
EXPECT_EQ(decoder->Decode(encoded_image, false, 0), WEBRTC_VIDEO_CODEC_ERROR);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user