Previously, number of decoder threads for VP9 were always set to 8 but with a cap at number of cores. This was done since we "can't know" the resolution that will be used. With this change, we now intialize the number of threads based on resolution given in InitDecode(). If a resolution change happens in flight, it requires a keyframe. We therefore parse the header from any key frame and if it has a new resolution, we re-initialize the decoder. The number of threads used is based on pixel count. We set one thread as target for 1280x720, and scale up lineraly from there. The 8-thread cap is gone, but still limit it core count. This means for instance: 1 <= 720p, 2 for 1080p, 4 for 1440p, 9 for 4K. Bug: webrtc:11551 Change-Id: I14c169a6c651c50bd1b870c4b22bc4495c8448fd Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/174460 Commit-Queue: Erik Språng <sprang@webrtc.org> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Cr-Commit-Position: refs/heads/master@{#31507}
90 lines
2.7 KiB
C++
90 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2017 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.
|
|
*/
|
|
|
|
#ifndef MODULES_VIDEO_CODING_UTILITY_VP9_UNCOMPRESSED_HEADER_PARSER_H_
|
|
#define MODULES_VIDEO_CODING_UTILITY_VP9_UNCOMPRESSED_HEADER_PARSER_H_
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include "absl/types/optional.h"
|
|
|
|
namespace webrtc {
|
|
|
|
namespace vp9 {
|
|
|
|
// Gets the QP, QP range: [0, 255].
|
|
// Returns true on success, false otherwise.
|
|
bool GetQp(const uint8_t* buf, size_t length, int* qp);
|
|
|
|
// Bit depth per channel. Support varies by profile.
|
|
enum class BitDept : uint8_t {
|
|
k8Bit = 8,
|
|
k10Bit = 10,
|
|
k12Bit = 12,
|
|
};
|
|
|
|
enum class ColorSpace : uint8_t {
|
|
CS_UNKNOWN = 0, // Unknown (in this case the color space must be signaled
|
|
// outside the VP9 bitstream).
|
|
CS_BT_601 = 1, // CS_BT_601 Rec. ITU-R BT.601-7
|
|
CS_BT_709 = 2, // Rec. ITU-R BT.709-6
|
|
CS_SMPTE_170 = 3, // SMPTE-170
|
|
CS_SMPTE_240 = 4, // SMPTE-240
|
|
CS_BT_2020 = 5, // Rec. ITU-R BT.2020-2
|
|
CS_RESERVED = 6, // Reserved
|
|
CS_RGB = 7, // sRGB (IEC 61966-2-1)
|
|
};
|
|
|
|
enum class ColorRange {
|
|
kStudio, // Studio swing:
|
|
// For BitDepth equals 8:
|
|
// Y is between 16 and 235 inclusive.
|
|
// U and V are between 16 and 240 inclusive.
|
|
// For BitDepth equals 10:
|
|
// Y is between 64 and 940 inclusive.
|
|
// U and V are between 64 and 960 inclusive.
|
|
// For BitDepth equals 12:
|
|
// Y is between 256 and 3760.
|
|
// U and V are between 256 and 3840 inclusive.
|
|
kFull // Full swing; no restriction on Y, U, V values.
|
|
};
|
|
|
|
enum class YuvSubsampling {
|
|
k444,
|
|
k440,
|
|
k422,
|
|
k420,
|
|
};
|
|
|
|
struct FrameInfo {
|
|
int profile = 0; // Profile 0-3 are valid.
|
|
bool show_frame = false;
|
|
bool error_resilient = false;
|
|
BitDept bit_detph = BitDept::k8Bit;
|
|
ColorSpace color_space = ColorSpace::CS_UNKNOWN;
|
|
ColorRange color_range;
|
|
YuvSubsampling sub_sampling;
|
|
int frame_width = 0;
|
|
int frame_height = 0;
|
|
int render_width = 0;
|
|
int render_height = 0;
|
|
};
|
|
|
|
// Parses frame information for a VP9 key-frame or all-intra frame from a
|
|
// bitstream. Returns nullopt on failure or if not a key-frame.
|
|
absl::optional<FrameInfo> ParseIntraFrameInfo(const uint8_t* buf,
|
|
size_t length);
|
|
|
|
} // namespace vp9
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_VIDEO_CODING_UTILITY_VP9_UNCOMPRESSED_HEADER_PARSER_H_
|