h->sps验证是否正确

事情是这样的,我把摄像头实时编码后,存成文件,用ffplay播放是完全正常的,现在要用RTP往外发送sps给vlc。所以要取到h->sps,但是我把它存成一个二进制文件,打开查看发现里面的值很少,所以想确认一下是不是取的是对的。

h-sps验证是否正确 - 加菲 - 视频会议 - 加菲
 
h-sps验证是否正确 - 加菲 - 视频会议 - 加菲
 
h-sps验证是否正确 - 加菲 - 视频会议 - 加菲
 
但是存储下来,发现里面绝大多数是00,而我打开一个正确编码的xxxx.264,却发现全是乱七八糟的(针对同一个摄像头,同一次编码),所以让我非常的不安,怎么就知道上面存下来的sps是不是对的了?一时非常担忧。

h-sps验证是否正确 - 加菲 - 视频会议 - 加菲

从头到尾都是这样子,根本没有与最开始的存下的sps类似的东西,所以很是让人担忧啊。难道我存下的sps是错的吗?



 
但是,我用如下代码来检验,对个别值,却是相符的:
CString str;
str.Format("sps->i_mb_width = %u ;sps->i_mb_height = %u ",h->sps->i_mb_width,h->sps->i_mb_height);//20,15
AfxMessageBox(str);//弹出来的是20,15,倒是和算下的值吻合(320/16 == 20  240/16 == 15)

而存储用的是如下代码,也没有错啊,上面的弹出检验和这是一个函数里的。
//写入一个文件检验是否正确
CFile file1(strFilePath, CFile::modeWrite|CFile::modeCreate);
file1.SeekToEnd();
file1.Write(h->sps,sizeof(x264_sps_t));
file1.Close();


是不是编码得到的xxx.264里,是经过某种压缩编码,所以看到的sps和自己单独存出来的sps不一样了?因为20的十六进制是14 00,15的十六进制是0F 00,这个在最上面的图里都有,而且也是挨着的。

为了测试一下,int i_sar_height;后面是int b_overscan_info_present,把b_overscan_info_present设置个值试试,如果二进制文件里发现有变化,好像会意味着某些事啊。

试了,发现不论设置0或1,都不变,哎。
h = x264_encoder_open( &param );
h->sps->vui.b_overscan_info_present = 1;


打开x264源码找了下,好像它是用 x264_sps_write( &h->out.bs, h->sps ); //序列参数集_写入
里面用了好多 bs_write_ue,说是指数哥伦布编码,我看到的乱码和自己存的二进制文件不一样好像是这个原因吧,因为我是直接存的
static void pl011_set_termios(struct uart_port *port, struct ktermios *termios, struct ktermios *old) { struct uart_amba_port *uap = container_of(port, struct uart_amba_port, port); unsigned int lcr_h, old_cr; unsigned long flags; unsigned int baud, quot, clkdiv; unsigned int bits; if (uap->vendor->oversampling) clkdiv = 8; else clkdiv = 16; /* * Ask the core to calculate the divisor for us. */ baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / clkdiv); #ifdef CONFIG_DMA_ENGINE /* * Adjust RX DMA polling rate with baud rate if not specified. */ if (uap->dmarx.auto_poll_rate) uap->dmarx.poll_rate = DIV_ROUND_UP(10000000, baud); #endif if (baud > port->uartclk/16) quot = DIV_ROUND_CLOSEST(port->uartclk * 8, baud); else quot = DIV_ROUND_CLOSEST(port->uartclk * 4, baud); switch (termios->c_cflag & CSIZE) { case CS5: lcr_h = UART01x_LCRH_WLEN_5; break; case CS6: lcr_h = UART01x_LCRH_WLEN_6; break; case CS7: lcr_h = UART01x_LCRH_WLEN_7; break; default: // CS8 lcr_h = UART01x_LCRH_WLEN_8; break; } if (termios->c_cflag & CSTOPB) lcr_h |= UART01x_LCRH_STP2; if (termios->c_cflag & PARENB) { lcr_h |= UART01x_LCRH_PEN; if (!(termios->c_cflag & PARODD)) lcr_h |= UART01x_LCRH_EPS; if (termios->c_cflag & CMSPAR) lcr_h |= UART011_LCRH_SPS; } if (uap->fifosize > 1) lcr_h |= UART01x_LCRH_FEN; bits = tty_get_frame_size(termios->c_cflag); spin_lock_irqsave(&port->lock, flags); /* * Update the per-port timeout. */ uart_update_timeout(port, termios->c_cflag, baud); /* * Calculate the approximated time it takes to transmit one character * with the given baud rate. We use this as the poll interval when we * wait for the tx queue to empty. */ uap->rs485_tx_drain_interval = DIV_ROUND_UP(bits * 1000 * 1000, baud); pl011_setup_status_masks(port, termios); if (UART_ENABLE_MS(port, termios->c_cflag)) pl011_enable_ms(port); if (port->rs485.flags & SER_RS485_ENABLED) termios->c_cflag &= ~CRTSCTS; old_cr = pl011_read(uap, REG_CR); if (termios->c_cflag & CRTSCTS) { if (old_cr & UART011_CR_RTS) old_cr |= UART011_CR_RTSEN; old_cr |= UART011_CR_CTSEN; port->status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS; } else { old_cr &= ~(UART011_CR_CTSEN | UART011_CR_RTSEN); port->status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS); } if (uap->vendor->oversampling) { if (baud > port->uartclk / 16) old_cr |= ST_UART011_CR_OVSFACT; else old_cr &= ~ST_UART011_CR_OVSFACT; } /* * Workaround for the ST Micro oversampling variants to * increase the bitrate slightly, by lowering the divisor, * to avoid delayed sampling of start bit at high speeds, * else we see data corruption. */ if (uap->vendor->oversampling) { if ((baud >= 3000000) && (baud < 3250000) && (quot > 1)) quot -= 1; else if ((baud > 3250000) && (quot > 2)) quot -= 2; } /* Set baud rate */ pl011_write(quot & 0x3f, uap, REG_FBRD); pl011_write(quot >> 6, uap, REG_IBRD); /* * ----------v----------v----------v----------v----- * NOTE: REG_LCRH_TX and REG_LCRH_RX MUST BE WRITTEN AFTER * REG_FBRD & REG_IBRD. * ----------^----------^----------^----------^----- */ pl011_write_lcr_h(uap, lcr_h); pl011_write(old_cr, uap, REG_CR); spin_unlock_irqrestore(&port->lock, flags); }
03-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值