Android:Android 4.0.4中的Stagefright H.264逐帧解码

时间:2014-09-06 07:31:00

标签: android h.264 stagefright

我在参考上一个问题here时提出这个问题  由于我无法解决摩托罗拉xoom设备中mp4文件的最后一帧的所有权问题,我想到尝试逐帧解码版本,我可以在某种程度上控制解码器的输入,并且可以知道它到达结束时流。
为此我写了一个派生mediasource的类并重写了read函数 当我实施它时,再次在Karbonn A9 +设备中它工作得有点好。但是在motorola xoom中,解码器似乎花费了太多时间用于所有分辨率,并且在每3-4帧后,读取返回以下错误。

09-06 11:49:47.663: E/OMXCodec(1281): [OMX.Nvidia.h264.decode] 
Timed out waiting for output buffers: 0/1

获得一帧需要3秒钟,否则大约需要1.8秒  我很少在karbonn设备中遇到同样的问题。

以下是我设置元数据的代码

err = calc_avcc_from_file(video_file, length_file, avcc);
len_avcc = sps_size + pps_size + 11;

//err = parseAVCCodecSpecificData(avcc, (size_t)len_avcc);
LOGP("avcc size = %d and error of parseAVCCodecSpecificData  %d", len_avcc, err);
meta_data->setData(kKeyAVCC, kTypeAVCC, avcc, (size_t)len_avcc);
meta_data->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
meta_data->setInt32(kKeyWidth, mDisplayWidth);
meta_data->setInt32(kKeyHeight, mDisplayHeight);
meta_data->setInt32(kKeyFrameRate, 29);
meta_data->setInt32(kKeyBitRate, 15000);
meta_data->setInt32(kKeyStride, mDisplayWidth);
meta_data->setInt32(kKeySliceHeight, mDisplayHeight);

实际上一开始我没有通过avcc,同样的问题就在那里。然后我想通过创建如下传递它,但没有找到改进。

int custom_decoder::calc_avcc(char *enc_strm, int enc_param_len, void *avcc) 
{
   int err = OFI_VC_ERR_SUCCESS;
   char *temp = (char *)avcc;
   LOGP("calculating avcc");

   err = calc_sps_pps_size (enc_strm, enc_param_len);

   *temp++ = 1;
   *temp++ = 66;
   *temp++ = 66;
   *temp++ = 1;
   *temp++ = 3;
   *temp++ = 1;
   *temp++ = 0;
   *temp++ = sps_size;
   memcpy(temp, sps_data, sps_size);
   temp += sps_size;
   *temp++ = 1;
   *temp++ = 0;
   *temp++ = pps_size;
   memcpy(temp, pps_data, pps_size);

   return err;
}

我错过了什么或出了什么问题...... 任何帮助将不胜感激....

0 个答案:

没有答案