Reallocate encoded buffer size if needed. Initially set to the input image size.
Issue may occur for very small input images (e.g. 4x4) when encoded image length > input image size. BUG=chromium:578193 Review URL: https://codereview.webrtc.org/1603643006 Cr-Commit-Position: refs/heads/master@{#11329}
This commit is contained in:
@ -659,6 +659,12 @@ int VP9EncoderImpl::GetEncodedLayerFrame(const vpx_codec_cx_pkt* pkt) {
|
|||||||
int part_idx = 0;
|
int part_idx = 0;
|
||||||
CodecSpecificInfo codec_specific;
|
CodecSpecificInfo codec_specific;
|
||||||
|
|
||||||
|
if (pkt->data.frame.sz > encoded_image_._size) {
|
||||||
|
delete[] encoded_image_._buffer;
|
||||||
|
encoded_image_._size = pkt->data.frame.sz;
|
||||||
|
encoded_image_._buffer = new uint8_t[encoded_image_._size];
|
||||||
|
}
|
||||||
|
|
||||||
assert(pkt->kind == VPX_CODEC_CX_FRAME_PKT);
|
assert(pkt->kind == VPX_CODEC_CX_FRAME_PKT);
|
||||||
memcpy(&encoded_image_._buffer[encoded_image_._length], pkt->data.frame.buf,
|
memcpy(&encoded_image_._buffer[encoded_image_._length], pkt->data.frame.buf,
|
||||||
pkt->data.frame.sz);
|
pkt->data.frame.sz);
|
||||||
|
|||||||
@ -2208,6 +2208,33 @@ void VideoSendStreamTest::TestVp9NonFlexMode(uint8_t num_temporal_layers,
|
|||||||
RunBaseTest(&test);
|
RunBaseTest(&test);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(VideoSendStreamTest, Vp9NonFlexModeSmallResolution) {
|
||||||
|
static const size_t kNumFramesToSend = 50;
|
||||||
|
static const int kWidth = 4;
|
||||||
|
static const int kHeight = 4;
|
||||||
|
class NonFlexibleModeResolution : public Vp9HeaderObserver {
|
||||||
|
void ModifyVideoConfigsHook(
|
||||||
|
VideoSendStream::Config* send_config,
|
||||||
|
std::vector<VideoReceiveStream::Config>* receive_configs,
|
||||||
|
VideoEncoderConfig* encoder_config) override {
|
||||||
|
vp9_settings_.flexibleMode = false;
|
||||||
|
vp9_settings_.numberOfTemporalLayers = 1;
|
||||||
|
vp9_settings_.numberOfSpatialLayers = 1;
|
||||||
|
|
||||||
|
EXPECT_EQ(1u, encoder_config->streams.size());
|
||||||
|
encoder_config->streams[0].width = kWidth;
|
||||||
|
encoder_config->streams[0].height = kHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InspectHeader(const RTPVideoHeaderVP9& vp9_header) override {
|
||||||
|
if (frames_sent_ > kNumFramesToSend)
|
||||||
|
observation_complete_.Set();
|
||||||
|
}
|
||||||
|
} test;
|
||||||
|
|
||||||
|
RunBaseTest(&test);
|
||||||
|
}
|
||||||
|
|
||||||
#if !defined(MEMORY_SANITIZER)
|
#if !defined(MEMORY_SANITIZER)
|
||||||
// Fails under MemorySanitizer:
|
// Fails under MemorySanitizer:
|
||||||
// See https://code.google.com/p/webrtc/issues/detail?id=5402.
|
// See https://code.google.com/p/webrtc/issues/detail?id=5402.
|
||||||
|
|||||||
Reference in New Issue
Block a user