pkt->pts有回退是因为有P帧吗
时间: 2024-05-24 14:11:55 浏览: 12
不一定。pkt->pts的回退可能是由于视频编码器的实现方式或者视频帧类型造成的。一般情况下,I帧的pts会比前面的P帧或B帧的pts更大,但是在某些情况下,编码器可能会采用一些特殊的算法,使得P帧的pts比前面的I帧更大,从而导致pkt->pts的回退。因此,不能单纯地通过帧类型来判断pkt->pts的回退。
相关问题
uint32_t Packet_CreatePingAck(Packet_t *pkt, uint8_t major, uint8_t minor, uint8_t bugfix, uint16_t option) { pkt->buf[0] = 0x5A; pkt->buf[1] = 0xA7; /* protocol bug fix */ pkt->buf[2] = bugfix; /* protocol minor */ pkt->buf[3] = minor; /* protocol major */ pkt->buf[4] = major; pkt->buf[5] = 'P'; /* option low: sender's address low */ pkt->buf[6] = (option & 0x00FF)>>0; /* option high: sender's address high */ pkt->buf[7] = (option & 0xFF00)>>8; /* crc */ uint16_t crc; crc = 0; crc16_update(&crc, &pkt->buf[0], 8); pkt->buf[8] = (crc & 0x00FF)>>0; pkt->buf[9] = (crc & 0xFF00)>>8; pkt->payload_len = 0; pkt->type = 0xA7; pkt->len = 10; return CH_OK; }
这个函数是用于创建Ping Ack数据包的函数。Ping Ack是一种用于测试网络连接的协议,它的作用是确认网络是否正常工作。
在函数中,首先将pkt->buf的前两个字节分别设为0x5A和0xA7,用于标识Ping Ack协议。然后将pkt->buf的第3、4、5个字节分别设为major、minor、bugfix,用于表示协议的版本号和修订号。接着,将pkt->buf的第6个字节设为字符'P',用于表示这是一个Ping Ack协议。接下来,将option参数的低字节和高字节分别存储到pkt->buf的第7、8个字节中,用于表示发送者的地址。最后,计算pkt->buf的CRC校验位,并将计算结果存储到pkt->buf的第9、10个字节中,用于检验数据的完整性。
在设置完数据包的头部和有效载荷后,将pkt->type设置为0xA7,表示这是一个Ping Ack数据包,将pkt->len设置为10,表示数据包的长度为10个字节,将pkt->payload_len设置为0,表示数据包没有有效载荷。
函数返回值为CH_OK,表示创建Ping Ack数据包成功。
uint32_t Packet_Final(Packet_t *pkt) { pkt->payload_len = pkt->ofs -6; pkt->len = pkt->ofs; pkt->buf[2] = (pkt->payload_len & 0x00FF)>>0; pkt->buf[3] = (pkt->payload_len & 0xFF00)>>8; /* crc */ uint16_t crc; crc = 0; crc16_update(&crc, &pkt->buf[0], 4); crc16_update(&crc, &pkt->buf[6], pkt->payload_len); pkt->buf[4] = (crc & 0x00FF)>>0; pkt->buf[5] = (crc & 0xFF00)>>8; return CH_OK; }
这段代码是一个名为Packet_Final的函数,它的作用是对一个名为Packet_t的结构体类型的数据包进行最终处理,包括计算数据包的长度、校验码等。函数返回一个uint32_t类型的值,如果函数执行成功则返回CH_OK,表示操作成功。
具体来说,函数会首先计算数据包的有效载荷长度,即数据包中除起始符、长度和校验码之外的部分的长度,这里使用pkt->ofs减去6来计算。然后,将pkt->len设置为pkt->ofs,表示数据包的长度为pkt->ofs。
接着,函数会将有效载荷长度写入数据包的len字段中,具体来说,将payload_len的低八位写入buf数组的第2个字节中,将payload_len的高八位写入buf数组的第3个字节中。
然后,函数会计算数据包的CRC校验码,具体来说,使用crc16_update()函数对buf数组中从第0个字节到第3个字节的数据进行计算,然后对buf数组中从第6个字节开始、长度为payload_len的数据进行计算,最后将计算得到的校验码写入buf数组的第4个字节和第5个字节中。
最后,函数返回CH_OK,表示操作成功。