bs_t结构及其相关函数的定义

本文深入探讨了H.264标准中关于比特流处理的细节,包括bs_t结构的定义、初始化、位置获取、判断是否到达文件末尾以及读取比特的操作。重点解释了bs_write函数的实现及其对i_bits_encoded字段的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此部分内容对应H.264标准9.1节及[2]中6.4.13小节

bs_t结构描述了比特流的概念 , 从比特流中进行顺序读写操作(相似于前向迭代器)

typedef struct bs_s

{

uint8_t *p_start; // 缓冲区首地址

uint8_t *p; // 缓冲区当前的读写指针

uint8_t *p_end; // 缓冲区尾地址

int i_left; // p所指字节当前还有多少比特可读写

int i_bits_encoded;

} bs_t;

void bs_init( bs_t *s void *p_data int i_data )

使用p_data指向的i_data个字节作为缓冲区初始化比特流s

 

int bs_pos( bs_t *s )

返回比特流s当前读写的位置(以比特为单位) , 相似于ftell的功能,

int bs_eof( bs_t *s )

当前是否已经位于比特流s的尾部 , 假如是 , 返回1;否则返回0

static uint32_t bs_read( bs_t *s int i_count )

从比特流s中读出i_count个比特的值并返回

static uint32_t bs_read1( bs_t *s )

从比特流s中读出1个比特并返回之

static uint32_t bs_show( bs_t *s int i_count )

从比特流中读出i_count个比特的值并返回 , 但是不移动读写指针

此处实现好像存在潜在的错误 , 即假如p1时 , 按照ue映射方式写入;其他情况下不执行任何操作 。

 

static void bs_rbsp_trailing( bs_t *s )

无论比特流当前位置是否字节对齐 , 都向其中写入一个比特1及若干个(0~7个)比特0 , 使其字节对齐

static int bs_size_ue( unsigned int val )

返回以ue方式对val进行Exp-goloma编码所需要的比特数 。

static int bs_size_se( int val )

返回以se方式对val进行Exp-goloma编码所需要的比特数 。

static int bs_size_te( int x int val )

返回以te方式对val进行Exp-goloma编码所需要的比特数 。 当x=1时 ,返回1;当x>1时 , 按照ue映射方式计算并返回;其他情况下返回0 。

 

#define bs_write(s,n,v)    ((s)->i_bits_encoded += (n))

void x264_sps_write( bs_t *s, x264_sps_t *sps )
{
   bs_write( s, 8, sps->i_profile_idc );


}

s是个bs_t指针,bs_write( s, 8, sps->i_profile_idc )只是更新了一下bs_t结构体的i_bits_encoded字段值。

 

def backend_worker(self): """后台计算线程""" t_list = [-1] + list(range(self.ue_move_t)) for t in t_list: processed_pcd = self.generate_ue_pos_and_ray_process(t) # 3. 将结果放入队列 self.data_queue.append(processed_pcd) def generate_ue_pos_and_ray_process(self, t): ue_file = "./input_data/ue_bs.xlsx" process_ue_bs_data("./input_data/TIMIMO成都外场基站终端GPS坐标.xlsx", ue_file) txs_raw = pd.read_excel(ue_file, 'tx') txs = [float(txs_raw['x'][0]), float(txs_raw['y'][0]), float(txs_raw['z'][0])] rxs_raw = pd.read_excel(ue_file, 'rx') rxs = [] for _, i in rxs_raw.iterrows(): rxs.append([float(i['x']), float(i['y']), float(i['z'])]) scene_file = os.path.join('./scene', 'scene.xml') scene = sionna_scene(scene_file, txs, rxs) if t == -1: scene.show() ue_paths, rays_coordinate = scene.run(save_rt_path=False, save_path=False, result_name='main_scene_') else: for idx, i in enumerate(scene.rxs): rx_name = "rx" + str(idx) random_direction = uniform_direction.rvs(2, random_state=idx + t) new_pos = scene.scene.receivers[rx_name].position print("======random_direction", random_direction) new_pos[0] += random_direction[0] new_pos[1] += random_direction[1] scene.scene.remove(rx_name) scene.scene.add(Receiver(name=rx_name, position=new_pos, display_radius=1)) ue_paths, rays_coordinate = scene.run(save_rt_path=False, save_path=False, result_name='random_move' + str(t)) # 启动后台线程 worker_thread = threading.Thread(target=self.backend_worker, daemon=True) worker_thread.start() worker_thread.join() 程序总是报错怎么修改
最新发布
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值