ffmpeg get_bits() 函数是如何工作的.

这篇具有很好参考价值的文章主要介绍了ffmpeg get_bits() 函数是如何工作的.。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

/*
 * 本测试程序用来说明 GetBitContext 是什么?
 *  get_bits() 函数是如何工作的.
 *  author: hjjdebug
 *  date:   2023年 07月 13日 星期四 16:42:45 CST
 */

GetBitContext 是如下定义的, 没有什么特别之处,指明了数据指针buffer,size_in_bits.
typedef struct GetBitContext {
    const uint8_t *buffer, *buffer_end;
    int index;
    int size_in_bits;
    int size_in_bits_plus8;
} GetBitContext;

unsigned int get_bits(GetBitContext *s, int n);
是如何从Ctx 中获取所需的数据位的,下面是测试程序,调试可完全搞懂.

$ cat main.c

#pragma GCC diagnostic ignored "-Wunused-parameter"
#include <libavcodec/get_bits.h>

//这个函数是get_bits.h 中get_bits函数的翻版, 把宏去掉方便看清本来面目
//改名字不与头文件中的名字冲突
//调试知get_bits() 原来是把左边的位去掉,把右边的位去掉,保留了所指定的 n bit位
static inline unsigned int my_get_bits(GetBitContext *s, int n)
{
    register unsigned int tmp;
//# 401 "../../FFmpeg-n4.4/libavcodec/get_bits.h"
    unsigned int re_index = (s)->index;
    unsigned int re_cache = av_bswap32((((const union unaligned_32 *) ((s)->buffer + (re_index >> 3)))->l)) << (re_index & 7); //数据会向左移动re_index位, 清理掉前面的bit位
    tmp = NEG_USR32(re_cache, n); //这是一个右移指令,>>右移32-n位,这样保留了左边的n位,清理了右边32-n位
    unsigned int re_size_plus8 = (s)->size_in_bits_plus8;
    re_index = ((re_size_plus8) > (re_index + (n)) ? (re_index + (n)) : (re_size_plus8)); // 给小的
    (s)->index = re_index;

    return tmp;
}

int main()
{
    GetBitContext gb;
    unsigned char data[4];
    data[0]=0x12;
    data[1]=0x34;
    data[2]=0x56;
    data[3]=0x78;
//    unsigned int a= NEG_USR32(0x12345678,31); 原来以为是取补呢,测试发现是右移指令,右移(32-31)位,即保留31位的意思
//    printf("%x\n",a);
    init_get_bits8(&gb,data,sizeof(data));
    int d1=my_get_bits(&gb,1);
    int d2=my_get_bits(&gb,2);
    int d3=my_get_bits(&gb,5);
    int d4=my_get_bits(&gb,4);
    printf("%x %x %x %x %x\n",data[0],d1,d2,d3,d4);
    return 0;
}文章来源地址https://www.toymoban.com/news/detail-575344.html

到了这里,关于ffmpeg get_bits() 函数是如何工作的.的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • gets和puts函数

    1.gets类似于scanf函数,用于读取标准输入。scanf函数在读取字符串时遇到空格就认为读取结束,所以当输入的字符串存在空格时,需要使用gets函数进行读取。 gets函数的格式如下: gets函数从标准输入中获取到字符并将其加载到str中,知道遇到换行符。当输入“how are you”,可

    2024年02月03日
    浏览(38)
  • 技术工作者们都在哪里聚集?这篇推荐让你一次性get到

    大家好,我是 jonssonyan,一名程序员,今天我来给大家推荐几个程序员常去的技术论坛。作为程序员,我们的知识储备和学习能力是至关重要的,而技术论坛则是获取最新技术动态和经验分享的最佳途径之一。在这篇文章中,我会给大家介绍一些我个人常去的技术论坛,希望

    2023年04月09日
    浏览(37)
  • 生成FPGA bit文件时,Vivado出现错误如何解决?

    生成FPGA bit文件时,Vivado出现错误如何解决? FPGA的编程过程中,生成bit文件是最后的关键步骤。然而,由于各种因素导致Vivado生成bit文件时可能会出现各种错误,其中一个常见问题是出现错误信息“[Vivado生成bit文件出现error解决 FPGA]”(Error generating bitstream),可能会让人感

    2024年01月22日
    浏览(48)
  • Python Get()函数用法介绍

    Python是一种高级编程语言,它具有简单、易学、高效等特点。而Python get()函数是其中一个重要的函数。该函数用于返回指定键的值,如果键不存在,则返回默认值None。 下面将从各个方面对Python get()函数做详细的阐述。 解释: key:字典中要查找的键 default:键不存在时要返回

    2024年02月07日
    浏览(51)
  • C语言gets( )函数详解

    1.描述  char* gets( char* str)函数:从标准输入(stdin)读取字符串, 遇到空格不结束,直到遇到回车 ,将字符串存储到str指向的字符串。 2.gets( )和scanf( )的区别 gets(str)和scanf(\\\"%s\\\",str)作用类似,但又有所不同。主要区别在于: gets(str) :读到回车换行才结束读取, 遇到空格不结

    2024年02月04日
    浏览(55)
  • 爬虫017_urllib库_get请求的quote方法_urlencode方法_---python工作笔记036

    按行来看get请求方式   比如这个地址   上面这个地址复制粘贴过来以后 可以看到周杰伦变成了一堆的Unicode编码了      所以这个时候我们看,我们说https这里,用了UA反爬,所以这里   我们构建一个自定义的Request对象,里面要包含Us

    2024年02月13日
    浏览(60)
  • Python 字典 get()函数使用详解,字典获取值

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》 get() 可以根据键 「获取值」 语法 参数 key :(必选)指定要搜索的键 value :(可选)如果键不存在,就返回

    2024年02月14日
    浏览(34)
  • hive中get_json_object函数

    原数据,表名:explode_test,列名:sale_info。  [{\\\"source\\\":\\\"7fresh\\\",\\\"monthSales\\\":4900,\\\"userCount\\\":1900,\\\"score\\\":\\\"9.9\\\"},{\\\"source\\\":\\\"jdmart\\\",\\\"monthSales\\\":7900,\\\"userCount\\\":2900,\\\"score\\\":\\\"5.9\\\"},{\\\"source\\\":\\\"yam\\\",\\\"monthSales\\\":54900,\\\"userCount\\\":12900,\\\"score\\\":\\\"4.9\\\"}] [{\\\"source\\\":\\\"7fresh\\\",\\\"monthSales\\\":4900,\\\"userCount\\\":1900,\\\"score\\\":\\\"9.9\\\"},{\\\"source\\\":\\\"jdmart\\\",\\\"

    2023年04月09日
    浏览(72)
  • ffmpeg的函数调用知识点

    av_dump_format 会打印出AVFormatContext的内容,打印的内容是什么意思? 我们使用av_dump_format打印出如下信息: 什么是文件的容器格式? \\\"mov,mp4,m4a,3gp,3g2,mj2\\\" 表示输入文件的容器格式(Container Format)支持的扩展名。 在多媒体文件中,容器格式用于组织和存储多个音视频流以及其他

    2024年02月16日
    浏览(49)
  • ffmpeg.c源码与函数关系分析

    FFmpeg 是一个可以处理音视频的软件,功能非常强大,主要包括,编解码转换,封装格式转换,滤镜特效。 FFmpeg支持各种网络协议,支持 RTMP ,RTSP,HLS 等高层协议的推拉流,也支持更底层的TCP/UDP 协议推拉流。 FFmpeg 可以在 Windows,Linux,Mac,iOS,Android等操作系统上运行。 F

    2024年02月14日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包