h264解码问题

fage2014 2015-08-05 11:22:17
先上代码:
int VideoDecoder_Decode(X264_H dwHandle, uint8_t *pDataIn, int nInSize, uint8_t *pDataOut, int nOutSize, int *nWidth, int *nHeight)//nOutSize
{
X264_Decoder_Handle *pHandle;
//*i_frame_size = 0;
if (dwHandle == 0)
{
return -1;
}
pHandle = (X264_Decoder_Handle *)dwHandle;


//pHandle->inbuf_ptr = pDataIn;
//pHandle->inSize = nInSize;
pHandle->avpkt.size = nInSize;
pHandle->avpkt.data = pDataIn;
while (pHandle->avpkt.size > 0) {
//LOGI("avcodec_decode_video2\n");
//pHandle->outSize = avcodec_decode_video2(pHandle->c, pHandle->picture, &pHandle->got_picture,
// pHandle->inbuf_ptr, pHandle->inSize);
pHandle->comsumedSize = avcodec_decode_video2(pHandle->c, pHandle->picture, &pHandle->got_picture, &(pHandle->avpkt));
if (pHandle->comsumedSize < 0) {

//LOGE("Error while decoding frame InSize = %d comsumedSize = %d\n", pHandle->avpkt.size,pHandle->comsumedSize);
//exit(1);
printf("222222222222222222222222222222222222222222222222222222222222222");
return -1;
}
if (pHandle->got_picture) {
//printf("saving frame %3d\n", pHandle->frame);
fflush(stdout);

/* the picture is allocated by the decoder. no need to
free it */
*nWidth = pHandle->c->width;
*nHeight = pHandle->c->height;
if(nOutSize >= (pHandle->c->width)*(pHandle->c->height)*3/2)
{
pgm_save2(pHandle->picture->data[0], pHandle->picture->linesize[0],pHandle->c->width, pHandle->c->height,pDataOut);
pgm_save2(pHandle->picture->data[1], pHandle->picture->linesize[1],pHandle->c->width/2, pHandle->c->height/2,pDataOut +pHandle->c->width * pHandle->c->height);
pgm_save2(pHandle->picture->data[2], pHandle->picture->linesize[2],pHandle->c->width/2, pHandle->c->height/2,pDataOut +pHandle->c->width * pHandle->c->height*5/4);
}

pHandle->frame_count++;
}
if (pHandle->avpkt.data) {
pHandle->avpkt.size -= pHandle->comsumedSize;
pHandle->avpkt.data += pHandle->comsumedSize;
}
}
printf("nOutSize: %d (pHandle->c->width)*(pHandle->c->height)*3/2: %d",nOutSize,(pHandle->c->width)*(pHandle->c->height)*3/2);
if(nOutSize < (pHandle->c->width)*(pHandle->c->height)*3/2)
{
printf("33333333333333333333333333333333333333333333333333333333333333");
// printf("nOutSize: %d (pHandle->c->width)*(pHandle->c->height)*3/2: %d",nOutSize,(pHandle->c->width)*(pHandle->c->height)*3/2);
return -1;
}
return 0;
}

用ffmpeg支持64的解码库解码时,这段解码代码在iphone5及以下(32位设备)解码时没问题,但在iphone5以上设备(64位设备)上解码时在以下代码处崩溃了,有人说是地址不匹配:
pHandle->avpkt.size = nInSize;
pHandle->avpkt.data = pDataIn;
崩溃信息如下:


到底是什么原因呢,又该怎么解决,哪位大神能够帮忙解答一下,不胜感激....
...全文
292 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
VLC Media Player在iOS32和64下运行都正常的,它是开源的,你可以看看它的解码器。
大熊猫侯佩 2015-08-05
  • 打赏
  • 举报
回复
cocoa自身没带有解码支持吗?如果没有找一下第三方的解码包。万不得已不用自己写解码代码。
大熊猫侯佩 2015-08-05
  • 打赏
  • 举报
回复
如果原来的解码代码没考虑到64位的情况,那么要手动自己重新修改。问题是你要改多少代码?
fage2014 2015-08-05
  • 打赏
  • 举报
回复
一般都是采用ffmpeg进行解码,但具体解码调用等得自己写
fage2014 2015-08-05
  • 打赏
  • 举报
回复
有啊,但效果太差了,很多马赛克,而且容易崩。用这套在32位的工作效果很好。不知道为什么会出现这个问题

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧