JM解码(一):参考帧列表和DPB处理

2023-11-05

以P帧为例:

void alloc_ref_pic_list_reordering_buffer(Slice *currSlice)
{
   int size = currSlice->num_ref_idx_active[LIST_0] + 1;
   if ((currSlice->modification_of_pic_nums_idc[LIST_0] = calloc(size ,sizeof(int)))==NULL) 
      no_mem_exit("alloc_ref_pic_list_reordering_buffer: modification_of_pic_nums_idc_l0");
   if ((currSlice->abs_diff_pic_num_minus1[LIST_0] = calloc(size,sizeof(int)))==NULL) 
      no_mem_exit("alloc_ref_pic_list_reordering_buffer: abs_diff_pic_num_minus1_l0");
   if ((currSlice->long_term_pic_idx[LIST_0] = calloc(size,sizeof(int)))==NULL) 
      no_mem_exit("alloc_ref_pic_list_reordering_buffer: long_term_pic_idx_l0");
   if ((currSlice->abs_diff_view_idx_minus1[LIST_0] = calloc(size,sizeof(int)))==NULL) 
      no_mem_exit("alloc_ref_pic_list_reordering_buffer: abs_diff_view_idx_minus1_l0");

   currSlice->modification_of_pic_nums_idc[LIST_1] = NULL;
   currSlice->abs_diff_pic_num_minus1[LIST_1] = NULL;
   currSlice->long_term_pic_idx[LIST_1] = NULL;
   currSlice->abs_diff_view_idx_minus1[LIST_1] = NULL;
}

num_ref_idx_active: 表示当前帧有几个参考帧
modification_of_pic_nums_idc:传输帧改变的方式:0,1,2分别是 短期的加 短期的减 长期
abs_diff_pic_num_minus1: 短期参考帧,传输和当前帧差值
long_term_pic_idx: 长期参考帧,传输POC

static void ref_pic_list_reordering(Slice *currSlice)
{
  //VideoParameters *p_Vid = currSlice->p_Vid;
  byte dP_nr = assignSE2partition[currSlice->dp_mode][SE_HEADER];
  DataPartition *partition = &(currSlice->partArr[dP_nr]);
  Bitstream *currStream = partition->bitstream;
  int i, val;

  alloc_ref_pic_list_reordering_buffer(currSlice);
  // 根据 num_ref_idx_active 分配内存空间
  
  if (currSlice->slice_type != I_SLICE && currSlice->slice_type != SI_SLICE)
  {
    val = currSlice->ref_pic_list_reordering_flag[LIST_0] = read_u_1 ("SH: ref_pic_list_reordering_flag_l0", currStream, &p_Dec->UsedBits);
	
	// 调整 RefList0
    if (val)
    {
      i=0;
      do
      {
      	// 先读一个修改模式
      	// 0||1 是修改短期参考帧
      	// 2 是修改长期参考帧
      	// 紧接着就是修改内容
        val = currSlice->modification_of_pic_nums_idc[LIST_0][i] = read_ue_v("SH: modification_of_pic_nums_idc_l0", currStream, &p_Dec->UsedBits);
        if (val==0 || val==1)
        {
          // 短期参考帧的帧偏移
          currSlice->abs_diff_pic_num_minus1[LIST_0][i] = read_ue_v("SH: abs_diff_pic_num_minus1_l0", currStream, &p_Dec->UsedBits);
        }
        else
        {
          if (val==2)
          {
            // 长期参考帧的 idx
            currSlice->long_term_pic_idx[LIST_0][i] = read_ue_v("SH: long_term_pic_idx_l0", currStream, &p_Dec->UsedBits);
          }
        }
        i++;
        // assert (i>currSlice->num_ref_idx_active[LIST_0]);
      } while (val != 3);
      // 3 是列表调整的循环停止标志
    }
  }

  // set reference index of redundant slices.
  if(currSlice->redundant_pic_cnt && (currSlice->slice_type != I_SLICE) )
  {
    currSlice->redundant_slice_ref_idx = currSlice->abs_diff_pic_num_minus1[LIST_0][0] + 1;
  }
}
void dec_ref_pic_marking(VideoParameters *p_Vid, Bitstream *currStream, Slice *pSlice)
{
  int val;

  DecRefPicMarking_t *tmp_drpm,*tmp_drpm2;

  // free old buffer content
  while (pSlice->dec_ref_pic_marking_buffer)
  {
    tmp_drpm=pSlice->dec_ref_pic_marking_buffer;

    pSlice->dec_ref_pic_marking_buffer=tmp_drpm->Next;
    free (tmp_drpm);
  }

#if (MVC_EXTENSION_ENABLE)
  if ( pSlice->idr_flag || (pSlice->svc_extension_flag == 0 && pSlice->NaluHeaderMVCExt.non_idr_flag == 0) )
#else
  if (pSlice->idr_flag)
#endif
  {
    pSlice->no_output_of_prior_pics_flag = read_u_1("SH: no_output_of_prior_pics_flag", currStream, &p_Dec->UsedBits);
    p_Vid->no_output_of_prior_pics_flag = pSlice->no_output_of_prior_pics_flag;
    pSlice->long_term_reference_flag = read_u_1("SH: long_term_reference_flag", currStream, &p_Dec->UsedBits);
  }
  else
  {
    pSlice->adaptive_ref_pic_buffering_flag = read_u_1("SH: adaptive_ref_pic_buffering_flag", currStream, &p_Dec->UsedBits);
    if (pSlice->adaptive_ref_pic_buffering_flag)
    {
      // read Memory Management Control Operation
      do
      {
        tmp_drpm=(DecRefPicMarking_t*)calloc (1,sizeof (DecRefPicMarking_t));
        tmp_drpm->Next=NULL;

        val = tmp_drpm->memory_management_control_operation = read_ue_v("SH: memory_management_control_operation", currStream, &p_Dec->UsedBits);

        if ((val==1)||(val==3))
        {
          tmp_drpm->difference_of_pic_nums_minus1 = read_ue_v("SH: difference_of_pic_nums_minus1", currStream, &p_Dec->UsedBits);
        }
        if (val==2)
        {
          tmp_drpm->long_term_pic_num = read_ue_v("SH: long_term_pic_num", currStream, &p_Dec->UsedBits);
        }

        if ((val==3)||(val==6))
        {
          tmp_drpm->long_term_frame_idx = read_ue_v("SH: long_term_frame_idx", currStream, &p_Dec->UsedBits);
        }
        if (val==4)
        {
          tmp_drpm->max_long_term_frame_idx_plus1 = read_ue_v("SH: max_long_term_pic_idx_plus1", currStream, &p_Dec->UsedBits);
        }

        // add command
        if (pSlice->dec_ref_pic_marking_buffer==NULL)
        {
          pSlice->dec_ref_pic_marking_buffer=tmp_drpm;
        }
        else
        {
          tmp_drpm2=pSlice->dec_ref_pic_marking_buffer;
          while (tmp_drpm2->Next!=NULL) tmp_drpm2=tmp_drpm2->Next;
          tmp_drpm2->Next=tmp_drpm;
        }

      }
      while (val != 0);
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JM解码(一):参考帧列表和DPB处理 的相关文章

  • opencv+nvcodec实现视频硬解码

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 系统配置 前言 一 NVCODEC是什么 二 OpenCV编译 1 安装Driver CUDA 2 编译OpenCV 总结 系统配置 操作系统 Ubuntu18 0
  • 【ElementUI组件】视频上传+计算视频时长

    效果如下 实现步骤 1 首先先安装官网的操作步骤安装elementui 或者 不安装直接引入 安装指令 npm i element ui S 引入方式 2 以下是参考代码 HTML代码 div div
  • Unity平台如何实现RTSP转RTMP推送?

    技术背景 Unity平台下 RTSP RTMP播放和RTMP推送 甚至包括轻量级RTSP服务这块都不再赘述 今天探讨的一位开发者提到的问题 如果在Unity下 实现RTSP播放的同时 随时转RTMP推送出去 RTSP转RTMP 在原生环境下
  • 视频无损放大修复工具:Topaz Video AI对Mac和Windows的系统要求

    Topaz Video AI是一款基于人工智能技术的视频增强软件 旨在提供高质量的视频修复 增强和转换功能 它可以通过智能算法和图像处理技术 改善视频的清晰度 稳定性 降噪效果 还能进行视频转码和格式转换 Mac Topaz Video A
  • 视频转码后有色差要如何处理

    目录 视频转码后有色差要如何处理 KEY COLOR STANDARD KEY COLOR RANGE 视频转码后有色差要如何处理 以下是回答 欢迎大家留言讨论补充 1 色差是如何产生的 1 有损压缩产生的质量损失 解决方法为尽可能的提高码
  • 音视频学习笔记(雷神)—技术解析

    音视频技术解析 封装技术 视频压缩编解码 音频压缩编解码 这是技术层 流媒体传输协议 这是网络层 视频播放器解析 解协议 从视频播放器的角度做解析 拿到传输而来的视频数据后 首先要解协议 传输协议 自然的本地视频经过硬盘传输数据自然没有解协
  • 使用OpenCV与深度学习从视频和图像中精准识别人脸: Python实践指南

    第一部分 引言与背景 人脸识别已经成为了当代技术领域中最热门和广泛应用的话题之一 从智能手机的解锁功能到机场的安全检查 人脸识别技术无处不在 在这篇文章中 我们将使用Python中的OpenCV库和深度学习模型 深入探讨如何从视频和图像中精
  • (十)老照片修复、图像超分、图片提高分辨率、图片高清化、图片清晰化、黑白图片上色、人脸祛斑、美颜、人体瘦身、图像去噪、人像抠图、批量处理、视频提高分辨率、视频逐帧修复

    十 老照片修复 图像超分 图片提高分辨率 图片高清化 图片清晰化 黑白图片上色 人脸祛斑 美颜 人体瘦身 图像去噪 人像抠图 批量处理 视频提高分辨率 视频逐帧修复 本文的代码的功能是 可以对图片文件 视频批量增强清晰度 对老照片进行修复
  • 除 ffmpeg x264 之外的 H264 编码器

    我正在开发的 iPhone 应用程序会在特定的用户定义的时间间隔内连续捕获图像 我正在寻找一种将这些图像组合成 H264 编码视频的方法 我在 Google 上做了一些研究 看起来我必须在 iPhone 上使用 ffmpeg mencode
  • 高效转码工具Compressor for Mac,让视频处理更轻松

    在现如今的数字时代 视频内容已经成为人们生活中不可或缺的一部分 无论是在社交媒体上分享生活点滴 还是在工作中制作专业的营销视频 我们都希望能够以高质量 高效率地处理和传输视频文件 而Compressor for Mac作为一款强大的视频转码
  • nodejs基于vue的视频分享投稿商城播放系统617bx

    本视频播放系统的设计目标是为用户提供一个便利的视频播放平台 同时系统融入投稿 商城以及论坛等功能模块 更全面的为用户提供服务 本文重点阐述了视频播放系统的开发过程 以实际运用为开发背景 基于vue框架 B S结构 运用了nodejs技术和M
  • 嵌入式开发、C++后端开发、C++音视频开发怎么选择?

    嵌入式开发 C 后端开发和C 音视频开发的选择问题 近年来 随着互联网和物联网的快速发展 嵌入式开发 C 后端开发和C 音视频开发等职业领域也逐渐受到广泛关注 对于有志于从事这些领域的人来说 如何做出选择呢 下面将从前景 薪酬和职业稳定性等
  • onvif协议笔记

    一 简介 ONVIF官网 ONVIF协议网络摄像机 IPC 客户端程序开发 1 专栏开篇 onvif协议开发 二 gSOAP gsoap官网 1 下载和编译 下载地址 bin sh 指定源码目录 解压源码 GSOAP SRC gsoap 2
  • 【音视频 | AAC】AAC音频编码详解

    博客主页 https blog csdn net wkd 007 博客内容 嵌入式开发 Linux C语言 C 数据结构 音视频 本文内容 介绍AAC音频编码 金句分享 你不能选择最好的 但最好的会来选择你 泰戈尔 本文未经允许 不得转发
  • ffmpeg 转换 x264 [错误]:大小为 769152 的 malloc 失败

    我正在尝试将从 Android 智能手表 mp4 格式 录制的视频转换为可在所有浏览器上播放的格式 mp4 从智能手表录制的视频未在浏览器中播放 所以 我使用 ffmpeg 将其转换为可播放的 mp4 格式 但有时它会显示错误x264 er
  • 免费音效素材网站,一次性介绍清楚

    不管是在游戏 电影 电视剧 短视频还是音频中 合适的音效能够更好的表达内容和渲染氛围 今天给大家分享几个免费音效素材 感兴趣的话可以接着往下看 一 制片帮素材 找音效 制片帮素材不仅有海量的优质视频素材 还有丰富的音效资源 分类清晰 更重要
  • macbook录屏快捷键大全,教你快速录制视频

    有人知道macbook电脑有录屏快捷键吗 现在录屏的速度太慢了 每次打开都要浪费不少时间 要是有录屏快捷键 应该会快很多 有哪位大佬知道吗 教教我 无论是在工作还是生活中 电脑已成为不可或缺的工具 而macbook作为苹果公司推出的一款笔记
  • 有没有实用的视频、图片素材网站推荐?

    在作品创作中 素材网站扮演着至关重要的角色 它们提供了海量的设计资源 为设计师 艺术家和创意工作者提供了无限的可能性 本文将为您介绍几款备受推崇的素材网站 帮助您开启创意之旅 一 制片帮素材 制片帮素材是一个提供海量精品视频素材的网站 站内
  • 实用软件分享,打工人必备~

    在这个数字化时代 各种实用软件已经成为我们生活中不可或缺的工具 它们可以帮助我们更高效地完成工作 提高生活质量 节省时间和精力 本文将为您介绍几款实用的软件 让您的工作和生活更加便捷 一 视频下载工具 犀牛下载器 一款免安装的在线视频下载工
  • 软件测试|使用Python轻松裁剪视频

    简介 裁剪视频是在视频编辑和处理中常见的任务之一 Python提供了多种库和工具 可以用来裁剪视频 在本文中 我们将详细讨论如何使用Python来裁剪视频 并提供示例代码 步骤1 环境准备 首先 我们要安装必要的Python库 我们将使用

随机推荐

  • TFTP常用命令

    一 上传到指定文件夹 tftp p l file target ip 这里的file可以是一个目录 如 C User Administrator Documents 二 下载到当前目录 tftp g r file source ip 这里的
  • webug 4.0 第十关 存储型xss

    感谢webug团队一直以来的更新维护 webug是什么 WeBug名称定义为 我们的漏洞 靶场环境基础环境是基于PHP mysql制作搭建而成 中级环境与高级环境分别都是由互联网漏洞事件而收集的漏洞存在的操作环境 部分漏洞是基于Window
  • 将在数组中的对象的 key,做替换

    固定更换个别 key key1 映射 stroke value 替代值不变 比如 value 的 stroke const arrayOfObj key1 value1 key2 value2 key1 value1 key2 value2
  • 什么是CSS权重值?CSS权重值的优先级是什么?

    什么是CSS的权重值 1 权重决定了你css规则怎样被浏览器解析直到生效 css权重关系到你的css规则是怎样显示的 2 当很多的规则被应用到某一个元素上时 权重是一个决定哪种规则生效 或者是优先级的过程 3 每个选择器都有自己的权重 你的
  • 华为OD机试 - 矩阵最大值(Python)

    题目描述 给定一个仅包含0和1的N N二维矩阵 请计算二维矩阵的最大值 计算规则如下 1 每行元素按下标顺序组成一个二进制数 下标越大越排在低位 二进制数的值就是该行的值 矩阵各行值之和为矩阵的值 2 允许通过向左或向右整体循环移动每行元素
  • python selenium从新浪财经网抓取一家公司的高管任职信息写入excel表格

    网址 http vip stock finance sina com cn corp go php vCI CorpManager stockid 600900 phtml 在页面按f12打开开发者工具 在table标签上右键复制xpath
  • SpringMvc学习-4-Spring MVC 拦截器

    SPring MVC JSON数据交互 Spring提供了一个HttpMessageConverter
  • excel多元线性拟合_急,如何用excel拟合多元函数

    数据如下 公式lny lnA aT blnK clnL D 其中AD是固定值 y是生产总值 T是时间 K是固定资产投资 L是就业 求用excel拟合方程求出abc 多谢了 急等各位大侠 生产总值 固定资产投资 时间 就业 522 28 11
  • 胡言乱语

    1 2013 4 10 又梦见你们苍苍的容颜 心里满满的自责 我早该长大了 不应该心存侥幸的在抗拒 让你们承受的太多了 愧疚难当
  • 最新CTR预测服务的GPU优化实践

    CTR模型在互联网的搜索 推荐 广告等场景有着广泛的应用 近年来 随着深度神经网络的引入 CTR模型的推理对硬件算力的要求逐渐增加 本文介绍了美团在CTR模型优化的实践 通过分析模型结构特点 结合GPU硬件架构 我们设计了一系列流程对模型进
  • 目标检测标签文件txt转成xml

    最近在用ppyolo训练好的模型对新采集的数据进行标记 再人工微调 减少从头打标签的时间 但是推理保存的结果都是txt格式的 想要在labelimg中可视化 那就需要将txt转换成xml 以下代码即可完成这一功能 coding UTF 8
  • Web_Components 系列(九)—— Shadow Host 的 CSS 选择器

    前言 在上一节我们了解了如何给自定义组件设置样式 当时是将自定义标签的样式设置在主 DOM 中的
  • docker从安装到入门(centos7连不上网)

    我们安装好centos7之后 只用网络链接的NAT模式 主机有网你就有网 傻瓜式链接 但是发现ping不通百度 通过ifconfig a发现ens33没有ip 虽然和这个没关系 因为用的是NAT模式 我们编辑vi etc sysconfig
  • OpenGL error 0x0502

    项目出现OpenGL error 0x0502 导致有些UI绘制不出来 大致情况是这样 游戏切换到后台之后 其他玩家发来语音 在语音还在播放的时候 切换回前台 这个时候语音服务器 用的融云 会推送到安卓底层 安卓底层有回调到cocos2dx
  • Linux系统之neofetch工具的基本使用

    Linux系统之neofetch工具的基本使用 一 neofetch工具介绍 1 1 neofetch简介 1 2 neofetch特点 二 检查本地环境 2 1 检查操作系统版本 2 2 检查内核版本 三 安装neofetch工具 3 1
  • VMware Workstation Pro 安装教程

    文章目录 笔者的运行环境 VMware Workstation 16 Pro Red Hat Enterprise Linux 8 3 0 需要提前一个操作系统的镜像文件 ISO 这个文件与 VMware 无关 实际上 在安装完 VMwar
  • 生成字典的三种方式

    字典是记录一些特殊或有目的性的密码集合 通常以txt格式进行记录保存 在渗透许多服务器 smb ftp ssh 远程桌面rdp 网页后台等一些用户登录时 没有正确密码 使用密码字典爆破就是最直接的黑客攻击方法 一 使用cupp工具生成 1
  • 对输入数据排序后进行二分查找(C语言)

    输入数据后的排序方法有很多种 这里我用的是暴力排序 各位友友们可以尝试更改排序方法 include
  • Python selenium 滚动页面以及滚动至元素可见之详细讲解

    我们滚动浏览器页面向上 下 左右可以用一下代码 向上和向左需要加 向下滚动xx个像素 driver execute script window scrollBy 0 xx 向上滚动x个像素 driver execute script win
  • JM解码(一):参考帧列表和DPB处理

    以P帧为例 void alloc ref pic list reordering buffer Slice currSlice int size currSlice gt num ref idx active LIST 0 1 if cur