/**
* Convert valid timing fields (timestamps / durations) in a packet from one
* timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be
* ignored.
*
* @param pkt packet on which the conversion will be performed
* @param src_tb source timebase, in which the timing fields in pkt are
* expressed
* @param dst_tb destination timebase, to which the timing fields will be
* converted
*/
void av_packet_rescale_ts(AVPacket *pkt, AVRational src_tb, AVRational dst_tb)
{
if (pkt->pts != AV_NOPTS_VALUE)
pkt->pts = av_rescale_q(pkt->pts, src_tb, dst_tb);
if (pkt->dts != AV_NOPTS_VALUE)
pkt->dts = av_rescale_q(pkt->dts, src_tb, dst_tb);
if (pkt->duration > 0)
pkt->duration = av_rescale_q(pkt->duration, src_tb, dst_tb);
}
av_packet_rescale_ts
用于调整AVPacket结构体中时间戳(timestamp)的单位。AVPacket结构体通常用于存储音频或视频流中的数据包。
参数说明:
pkt
:指向AVPacket结构体的指针。src_tb
:源时间基准。这是一个AVRational结构体,用于表示原始时间戳的单位。dst_tb
:目标时间基准。这是一个AVRational结构体,用于表示调整后时间戳的单位。
函数实现原理:
首先,函数会检查AVPacket结构体中的pts
(显示时间戳)、dts
(解码时间戳)和duration
(持续时间)是否为AV_NOPTS_VALUE
,如果不是,则对这些时间戳进行调整。
av_rescale_q
是一个用于调整时间戳的函数,它接受三个参数:a
(原始时间戳)、b
(原始时间基准)和c
(目标时间基准)。函数会将a
从b
转换为c
。
注意事项:
- 在使用这个函数之前,请确保已经正确设置了AVPacket结构体中的时间戳。
- 注意检查
src_tb
和dst_tb
的值是否合法,否则可能导致转换结果不正确。