自己的MID平台播放视频支持的格式有限,按照应用要求需要扩展更多的格式。6410自己是带MFC(multi format codec),支持MPEG4,H263,H264的硬解码。通过ls -l /dev可以得知s3c-mfc的驱动模块已经加载了,在android中操纵MFC的编解码部分是在external/opencore/codecs_v2/video/s3c_mfc目录下,发出IO控制。在SD卡中拷贝了.mp4视频文件,的确可以播放,下面跟踪下MFC的工作流程。
内核启动初始化:
1)执行s3c_mfc_init(),打印“S3C6400 MFC Driver, (c) 2007 Samsung Electronics”;
2)注册平台设备platform_driver_register(&s3c_mfc_driver);成功的话打印“S3C6400 MFC driver module init OK”
3)模块加载完毕后,就开始进入s3c_mfc_probe();
4)获取MFC时钟、打开MFC时钟,映射寄存器物理地址;
5)获取中断、注册中断;
6)调用MFC_MemorySetup() 设置SFR buffer, Bitprocessor buffe(code,work,para)r, Data buffer(stream,yuv frame);
7)调用MFC_HW_Init(),初始化硬件;
1,调用MfcReset(),复位MFC IP;
2,调用MfcFirmwareIntoCodeBuf(),加载MFC模块内部固件;
3,调用MfcStartBitProcessor(),启动BitProcessor;
4,调用MfcConfigSFR_BITPROC_BUF(),为BitProcessor的主控制器code,work,para三个控制寄存器配置地址;
5,调用MfcConfigSFR_CTRL_OPTS(),设置BitProcessor的其它控制寄存器;
8)禁用时钟,把MFC设置成LP_MODE,进入挂起就绪态;
上层应用程序开始执行调用H.264 decode时:
0)上层调用s3c_mfc_open()打开MFC设备;
1)调用MFCInst_Create()创建MFC实例,可以创建多个实例;
2)返回s3c_mfc_open: mfc open success,open结束。
3)调用s3c_mfc_ioctl,执行IOCTL_MFC_GET_LINE_BUF_ADDR,设置line_buf或者ring_buf;
4)调用s3c_mfc_ioctl,执行IOCTL_MFC_MPEG4_DEC_INIT,解码初始化;获取流文件长度及输出YUV的frame的宽高
5)调用s3c_mfc_ioctl,执行IOCTL_MFC_MPEG4_DEC_EXE,解码;在内存中对in buf的流数据解码,赋给out buf的YUV frame
6)视频播放过程中,s3c_mfc_ioctl反复调用:IOCTL_MFC_GET_FRAM_BUF_ADDR和IOCTL_MFC_MPEG4_DEC_EXE;
7)解码完毕,调用MFCInst_Delete释放实例;
参考地址:http://spaces.baidu.com/aokikyon/blog/category/6410