This is a simple patch to make xvba-va-driver working with Level51 files.
Additionally it makes playback of broken Level41 files possible.
It uses gwen's method (seeh h264 Level standards) of calcing max_reframes and changes the level to 51 if they are over spec.
http://paste.ubuntu.com/1073464/
Code:
diff --git a/src/xvba_buffer.c b/src/xvba_buffer.c
index 4facbbf..d8012a3 100644
--- a/src/xvba_buffer.c
+++ b/src/xvba_buffer.c
@@ -368,23 +368,18 @@ translate_VAPictureParameterBufferH264(
obj_context->picture_height
);
- /* Check for H.264 content over HP@L4.1 */
+ /* Check for wrongly coded H264 Level 41 files
+ adjust profile to Level 51 when reframes are too many
+ */
unsigned int num_ref_frames = pic_param->num_ref_frames;
- if (profile == XVBA_H264_HIGH && level > 41) {
- if (!driver_data->warn_h264_over_hp_l41) {
- driver_data->warn_h264_over_hp_l41 = 1;
- xvba_information_message(
- "driver does not support H.264 content over HP@L4.1. "
- "Please upgrade.\n"
- );
- }
+ if (profile == XVBA_H264_HIGH && level == 41) {
- /* Use fail-safe values (lower ref frames) */
+ /* Increase Level to decode pseudo Level 41 as Level 51 */
const unsigned int mbw = pic_param->picture_width_in_mbs_minus1 + 1;
const unsigned int mbh = (obj_context->picture_height + 15) / 16;
const unsigned int max_ref_frames = 12288 * 1024 / (mbw * mbh * 384);
if (max_ref_frames < num_ref_frames)
- num_ref_frames = max_ref_frames;
+ level = 51;
}
XVBABufferDescriptor * const xvba_buffer = obj_surface->pic_desc_buffer;