ref: bd1d995cd38b4e31a01356079f1d94067273eb28
parent: c22ab8ab9fda2fc38128e72f3c051739a32a71d4
author: Jerome Jiang <[email protected]>
date: Wed Nov 29 10:06:35 EST 2017
Add frame width & height to frame pkt. Add test. Used to return correct frame width and height when dynamic resizing happens. BUG=webm:1474 Change-Id: Ia2043f7e1635b3821848a67b9b134f47f14b0f3a
--- a/test/resize_test.cc
+++ b/test/resize_test.cc
@@ -277,6 +277,21 @@
SetMode(GET_PARAM(1));
}
+ virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
+ ASSERT_NE(static_cast<int>(pkt->data.frame.width), 0);
+ ASSERT_NE(static_cast<int>(pkt->data.frame.height), 0);
+ encode_frame_width_.push_back(pkt->data.frame.width);
+ encode_frame_height_.push_back(pkt->data.frame.height);
+ }
+
+ unsigned int GetFrameWidth(size_t idx) const {
+ return encode_frame_width_[idx];
+ }
+
+ unsigned int GetFrameHeight(size_t idx) const {
+ return encode_frame_height_[idx];
+ }
+
virtual void DecompressedFrameHook(const vpx_image_t &img,
vpx_codec_pts_t pts) {
frame_info_list_.push_back(FrameInfo(pts, img.d_w, img.d_h));
@@ -283,6 +298,8 @@
}
std::vector<FrameInfo> frame_info_list_;
+ std::vector<unsigned int> encode_frame_width_;
+ std::vector<unsigned int> encode_frame_height_;
};
TEST_P(ResizeTest, TestExternalResizeWorks) {
@@ -296,6 +313,9 @@
const unsigned int frame = static_cast<unsigned>(info->pts);
unsigned int expected_w;
unsigned int expected_h;
+ const size_t idx = info - frame_info_list_.begin();
+ ASSERT_EQ(info->w, GetFrameWidth(idx));
+ ASSERT_EQ(info->h, GetFrameHeight(idx));
ScaleForFrameNumber(frame, kInitialWidth, kInitialHeight, &expected_w,
&expected_h, 0);
EXPECT_EQ(expected_w, info->w)
@@ -464,8 +484,23 @@
++mismatch_nframes_;
}
+ virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
+ ASSERT_NE(static_cast<int>(pkt->data.frame.width), 0);
+ ASSERT_NE(static_cast<int>(pkt->data.frame.height), 0);
+ encode_frame_width_.push_back(pkt->data.frame.width);
+ encode_frame_height_.push_back(pkt->data.frame.height);
+ }
+
unsigned int GetMismatchFrames() { return mismatch_nframes_; }
+ unsigned int GetFrameWidth(size_t idx) const {
+ return encode_frame_width_[idx];
+ }
+
+ unsigned int GetFrameHeight(size_t idx) const {
+ return encode_frame_height_[idx];
+ }
+
void DefaultConfig() {
cfg_.rc_buf_initial_sz = 500;
cfg_.rc_buf_optimal_sz = 600;
@@ -493,6 +528,8 @@
bool change_bitrate_;
double mismatch_psnr_;
int mismatch_nframes_;
+ std::vector<unsigned int> encode_frame_width_;
+ std::vector<unsigned int> encode_frame_height_;
};
TEST_P(ResizeRealtimeTest, TestExternalResizeWorks) {
@@ -582,6 +619,9 @@
int resize_count = 0;
for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin();
info != frame_info_list_.end(); ++info) {
+ const size_t idx = info - frame_info_list_.begin();
+ ASSERT_EQ(info->w, GetFrameWidth(idx));
+ ASSERT_EQ(info->h, GetFrameHeight(idx));
if (info->w != last_w || info->h != last_h) {
resize_count++;
if (resize_count == 1) {
--- a/vp8/vp8_cx_iface.c
+++ b/vp8/vp8_cx_iface.c
@@ -902,6 +902,8 @@
(unsigned long)((delta * ctx->cfg.g_timebase.den + round) /
ctx->cfg.g_timebase.num / 10000000);
pkt.data.frame.flags = lib_flags << 16;
+ pkt.data.frame.width = cpi->common.Width;
+ pkt.data.frame.height = cpi->common.Height;
if (lib_flags & FRAMEFLAGS_KEY) {
pkt.data.frame.flags |= VPX_FRAME_IS_KEY;
--- a/vp9/vp9_cx_iface.c
+++ b/vp9/vp9_cx_iface.c
@@ -1260,6 +1260,8 @@
pkt.data.frame.duration = (unsigned long)ticks_to_timebase_units(
timebase, dst_end_time_stamp - dst_time_stamp);
pkt.data.frame.flags = get_frame_pkt_flags(cpi, lib_flags);
+ pkt.data.frame.width = cpi->common.width;
+ pkt.data.frame.height = cpi->common.height;
if (ctx->pending_cx_data) {
ctx->pending_frame_sizes[ctx->pending_frame_count++] = size;
--- a/vpx/vpx_encoder.h
+++ b/vpx/vpx_encoder.h
@@ -63,7 +63,7 @@
* fields to structures
*/
#define VPX_ENCODER_ABI_VERSION \
- (6 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/
+ (7 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/
/*! \brief Encoder capabilities bitfield
*
@@ -182,6 +182,8 @@
* Only applicable when "output partition" mode is enabled. First
* partition has id 0.*/
int partition_id;
+ unsigned int width; /**< frame width */
+ unsigned int height; /**< frame height */
} frame; /**< data for compressed frame packet */
vpx_fixed_buf_t twopass_stats; /**< data for two-pass packet */
vpx_fixed_buf_t firstpass_mb_stats; /**< first pass mb packet */