日常问题--拉流时,视频有回放

问题描述:拉流时不流畅,仔细观察发现,实时播放一段后会回放前一小段视频,然后再实时再回放。。。
初步排查:
1、将视频在vsf库进行本地存储,播放本地存储的文件发现同样是卡顿的。
定位视频在我们推送出去之前就出了问题
2、用amba_debug -r 0x08000000 -s 0x00600000 -f /tmp/123.video命令,直接将bsb_buffer数据拷贝出来播放,发现这里面的数据是连续流畅的。
这样来说驱动应该是ok的,在vsf调用ioctl取上来的数据出现了问题
3、在vsf中屏蔽掉2a的初始化和start,启动后发现无法进入preview和idle状态
想排除2a的影响无法实现
4、PIR模式和正常模式各试一遍,在本地均存储录像,均会出现卡顿
说明跟启动模式无关
(敲黑板!!!重点!!!找到上一次正常的节点)
SDK2.5 PIR启动模式h264拉流是正常的!
思路,恢复到正常的节点,逐个添加库,查找问题节点。

拉流正常节点《1》:
启动方式:PIR
uboot : svn上最新版本,编码方式改为h264
amba_video.ko : svn上最新版本
vsf:回退到前一版本
2a库:svn上版本
应用库:svn上最新版本(下发的应该是h265编码,PIR模式无法setformat)

拉流正常节点《2》:(继续推进)
启动方式:PIR和正常启动
uboot : svn上最新版本,编码方式改为h264
amba_video.ko : svn上最新版本
vsf:svn上最新版本
2a库:提供的最新2a库
应用库:svn上最新版本(正常启动模式强制将下发命令改为264)

在《2》的正常启动模式下,下发命令改为265(即boot阶段设为264,应用拉流时下发编码为265)
现象:没有码流,查看日志时有以下错误,
1、(VSF_drvEncSetFmt|3542):VSF_drvRoiReSet failed
2、check_encode_stream_type(1290):cannot start HEVC clock is disabled! check_encode_stream_state(1341):invalid encode type for stream B
注:问题2跟踪过,将boot启动阶段设成265即解决,但这样又回到了拉流卡顿的问题
问题2解决:原因是在boot设置为264的时候将265的HEVC关闭了
writel(DSP_HEVC_STATE_REG,DSP_HEVC_STATE_OFF);
#define DSP_HEVC_STATE_REG (0xEC17008C)
#define DSP_HEVC_STATE_OFF 0x37DF
#define DSP_HEVC_STATE_ON 0x3FFF

调试时用到的几个命令:
查看码流:test_encode –show-stream
关闭码流:test_encode -B -s
开启码流:test_encode -B -H 720p -e

拉流正常节点《3》:(继续推进)
启动方式:正常启动
uboot : svn上最新版本,编码方式改为h264
amba_video.ko : svn上最新版本
vsf:svn上最新版本
2a库:提供的最新2a库
应用库:svn上最新版本(下发命令为265)

在节点《3》的基础上,只是将uboot中的编码方式改为265,问题就会复现。这样基本上可以确认问题是由于uboot编码265引起的。

排查方法1:为了进一步确认上层应用的一致性,将上层下发命令日志进行抓取对比

logView命令使用:
帮助命令:logView -help
设置输出级别:logView -p all 3 (一定要将等级设置最高,否则重定向后也不会有日志输出)
重定向输出:logView -r kernel 1 (将内核日志重定向到当前输出端口)

查看码流时间戳命令:
test_stream –nofile –show-pts(不加上–nofile参数会报错)

VLC H265和H264切换:
工具—->首选项—->全部—->去复用器

排查方法2:排除应用的差异
用sdk2.5的test_stream命令进行录像,查看是否正常
test_stream -f /home/test (需先将/home目录挂载,且异常情况下,帧率跳动幅度非常大,正常为25fps)
通过录像视频查看,同样存在花屏和回放的问题,这样就排除了应用侧的差异,把问题定位到驱动及以下

排查方法3:差异定位
前面已经明确了正常与异常的差异,h264–>OK h265–>ERROR
重点应该对比这两部分代码的差异。

/***********H264***************/
setup_encoder_720p.codeing_type = 1;//指定编码类型
setup_encoder_720p.encode_h_sz = 720;
setup_encoder_720p.title_num = 3;
start_encoder_720p.frame_crop.bits.offset_bottom = 0;
start_encoder_720p.h264_vui.fixed_frame_rate_flag = 1;
//writel(DSP_HEVC_STATE_REG,DSP_HEVC_STATE_OFF);

/***********H265***************/
setup_encoder_720p.codeing_type = 2;
setup_encoder_720p.encode_h_sz = 720;
setup_encoder_720p.title_num = 3;
start_encoder_720p.frame_crop.bits.offset_bottom = 0;
start_encoder_720p.h264_vui.fixed_frame_rate_flag = 0;
writel(DSP_HEVC_STATE_REG,DSP_HEVC_STATE_ON);

以上代码对比基本上也看不出来什么,因为amba源码不开放的原因,每个参数具体的含义,及在底层的操作我们是不清楚的。结合视频的一些现象,特别是回放这一块,我们想到去查看码流的时间戳:
test_stream –nofile –show-pts
发现h265模式下,时间戳连续三帧打的是一样的,这说明码流在打时间戳时就出了问题,连续三帧一样,这样我们就尝试着把setup_encoder_720p.title_num = 3参数值由3改为1,再用test_stream录像时这时帧率已经变的很稳定,播放录像也正常了。

至此已经确定问题就是setup_encoder_720p.title_num参数设置问题,具体为什么会这样,即本质原因已经反馈给amba的FAE,等待回复中。

问题最终定位:
DSP_BSH_SIZE太小,加载iav驱动太靠后,boot阶段编码的数据被充掉,并且循环覆盖存在一定的问题,导致无法取到正确的编码信息。(初步的个人总结,还需和安霸再探讨下,详细结论)
更改办法:
修改DSP_BSH_SIZE大小,从16k到128k
boot下修改:
s3l_mem.h文件
#define DSP_BSH_SIZE (128 << 10)

驱动下修改:
amba_arch_mem.h文件
#define DSP_BSH_SIZE   (128 << 10)
iav_config.h文件
#define NUM_BS_DESC   (2048)

BSH命令结构体如下,大小为64字节

typedef struct enc_bits_info_s
{
    //W0
    uint32_t   stream_id :8;
    uint32_t   jpeg_quality :8;
    uint32_t   bitrate_kbps :16;
    //W1
    uint32_t   pic_type :4;
    uint32_t   pic_level :3;
    uint32_t   pic_is_ref :1;
    uint32_t   pic_struct :1;
    uint32_t   tile_id :2;
    uint32_t   tile_num :2;
    uint32_t   pts_minus_dts :5;
    uint32_t   top_field_first :1;
    uint32_t   repeat_first_field :1;
    uint32_t   pic_is_longterm_ref :1;
    uint32_t   pic_output_flag :1;
    uint32_t   reserved_0 :10;
    //W2
    uint32_t   sliceheader_offset :16;
    uint32_t   slice_num :8;
    uint32_t   slice_idx :8;
    //W3-8
    uint32_t   frame_num;
    uint32_t   pts_64;
    uint32_t   bits_start_addr;
    uint32_t   bits_size :24;
    uint32_t   reserved_2 :8;
    uint32_t   checksum;
    //W9-15
    /*Padd to make it total of 64 bytes*/
    uint32_t   mvdump_curr_daddr;
    uint32_t   reserved_3[6];
}enc_bits_info_t;

调试现象:
在iav_enc_stream.c文件的iav_add_frame_desc函数中添加如下打印:

printk("[0x%p].[%d].[%llu]\n",iav->bsh,bsh->frame_num,bsh->pts_64);

异常的打印:

[0x873e8440].[482].[355840316806747360]
[0x873e8480].[483].[355840316806747360]
[0x873e84c0].[244].[216738528091158059]
从打印来看,地址是0x40(64字节)不断累加,但帧有回退,且[482]和[483]帧pts(时间戳)一样的,这也有问题,说明帧信息已经被充乱了。

帧率设置:首先是要设置Vin的编码能力,即sensor的编码能力
{0x0341,0x66}//29.97 fps
然后再通过比例来调节码流帧率:
.multiplication_factor = 1,
.division_factor = 1,

multiplication_factor为分子,division_factor为分母。例如要将vin的30fps的编码能力,设置成为25fps码流,可将参数设置如下:
multiplication_factor = 25
division_factor = 30
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值