工具/软件:Linux
我想在 LCD 接口上解码 H.264流。
我们的 LCD 接口仅需要 HSYNC、VSYNC 和 RGB565数据。
我将使用 logicpd LCD 器件驱动程序、我们的原理图就像折页。
在 FrameBuffer 上绘制矩形对以下源代码工作正常、
但解码 h.264不起作用。 我为我们修改了演示/解码源代码。
有人能不能给我们任何提示,问题是什么??
感谢您的阅读。
帧缓冲源代码
#include
#include
#include
#include
#include
#include
#include
int main()
{
int fbfd = 0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo ffo;
long int screensize = 0;
char * fbfbp = 0;
int x = 0、y = 0;
long int location = 0;
//打开文件以读取和写入
fbfd = open ("RDWr"、/dev/fb/2);
如果(fbfd =-1){
perror ("错误:无法打开帧缓冲器设备");
exit (1);
}
printf ("帧缓冲器设备已成功打开。\n");
//如果
(ioctl (fbfd、FBIOGET_FSCREENINFO、&fino
));//获得固定屏幕信息('= 1);读取错误('perror = 1)
//获取可变屏幕信息
if (ioctl (fbfd、FBIOGET_VSCREENINFO、&vinfo)=-1){
perror ("读取变量信息时出错");
exit (3);
}
printf ("%DX%d、%dbpp\n"、vinfo.xres、 vinfo.yres、vinfo.bits_per_pixel);
//以字节为单位计算屏幕大小
screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
//将器件映射到内存
FBP =(char *) mmap (0、screensize、prot_read | prot_write、fd_shared 0);
如果(((int)FBP =-1){
perror ("Error: Failed to map framebuffer device to memory");
exit (4);
}
printf ("framebuffer device was mapped successfully.\n");
x = 300;y = 100; //我们要放置像素的位置
//确定在存储器中放置(
y = 100;y < 300;y++)(
x = 100;x < 300;x++){
location =(x+vinfo.xoffset)*(vinfo.bits_per_pixel/8)+
(y+vinfo.yoffset_length *)的像素的位置;
if (vinfo.bits_per_pixel = 32){
*(FBP +位置)= 100; //一些蓝色
*(FBP +位置+ 1)= 15+(x-100)/2; //小绿色
*(FBP +位置+ 2)= 200-(y-100)/5;//大量红色
*(FBP +位置+ 3)= 0; //无透明度
}否则{//假设16bpp
int b = 10;
int g =(x-100)/6; //小绿色
int r = 31-(y-100)/16;//大量红色
无符号短整型 t = r<11 | g << 5 | b;
*(无符号短整型*)(FBP +位置))= t;
}
}
munmap (FBP、屏幕尺寸);
close (fbfd);
return 0;
}
来自解码器应用程序的 display.c
/*
* display.c
*
*===================================================================================
*版权所有(c) Texas Instruments Inc 2009
*
*本软件的使用受
*许可协议中提供或提供本软件的条款和条件的控制。
*====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "display.h"
#include "help.h"
#include "main.h"
/*显示循环延迟*/
#define DISPLAYLOOPLAATENCY 3332
//显示驱动程序的缓冲区*/
#define NUM_DISPLAY_BUFS 2
/
*显示视频
/
void *显示 ThrFxn (void * arg)
{
DisplayEnv *羡慕 =(DisplayEnv *)参数;
//Display_Attrs dAttrs = Display_Attrs_DM365_VID_DEFAULT;
Display_Attrs dAttrs = Display_Attrs_DM365_attr_default;
Framecopy_Attrs fcAttrs = Frameccopy_Attrs_default;
Display_Handle hDisplay =空;
Framecopy_handle HFC =空;
无效 *状态 =线程成功;
和非平衡变压器 frameCnt = 0;
Int32. 削波宽度= 0;
Int32. 削波高度= 0;
Int32. srcWidth = 0;
Int32. srcHeight = 0;
Int32. dstWidth = 0;
Int32. dstHeight = 0;
Int32. DSTX = 0;
Int32. DstY = 0;
BufferGfx_Dimensions srcDim、dstDim;
Buffer_Handle hSrcBuf、hDstBuf;
内部 五流星;
Colorspace_Type Colorspace = Colorspace_YUV420PSRI;
BufferGfx_Attrs gfxAttrs =缓冲器 Gfx_Attrs_default;
BufTab_handle hBufTab =空;
Int32. bufSize;
Time_Attrs tAttrs = time_Attrs_default;
Time_Handle HTime =空;
Int32. Time、WaitTime;
if (VideoStd_getResolution (envp->videoStd、.gfxAttrs.dim.width、&gfxAttrs.dim.height)< 0){
ERR("Failed to calculate resolution of video standards\n");
清理(thread_failure);
}
gfxAttrs.dim.lineLength =((Int32)((BufferGfx_calcLineLength (gfxAttrs.dim.width、colorspace)+31)/32))*32;
gfxAttrs.dim.x = 0;
gfxAttrs.dim.y = 0;
if (colorspace =colorspace_YUV420PSRI){
bufSize = gfxAttrs.dim.lineLength * gfxAttrs.dim.height * 3 / 2;
} 否则{
bufSize = gfxAttrs.dim.lineLength * gfxAttrs.dim.height * 2;
}
/*创建用于设备驱动程序的缓冲区表*/
gfxAttrs.colorspace =颜色空间;
hBufTab = BufTab_create (NUM_DISPLAY_BUFS、bufSize、
BufferGfx_getBufferAttrs (&gfxAttrs));
if (hBufTab = NULL){
ERR("Failed to create buftab\n");
清理(thread_failure);
}
/*创建显示设备实例*/
dAttrs.numBufs = NUM_DISPLAY_BUFS;
dAttrs.videoStd = envp->videoStd;
dAttrs.videoOutput = envp->displayOutput;
// dAttrs.colorspace =色空间;// mach
dAttrs.displayDevice ="/dev/fb/2;// mach
// dAttrs.displayDevice ="/dev/video2;// mach
printf ("displayDevice is %s\n"、dAttrs.displayDevice");fflush (stdout);
#if 1// mach
hDisplay = Display_create (hBufTab、&dAttrs);
if (hDisplay == NULL){
ERR("创建显示设备失败\n");
清理(thread_failure);
}
#endif
/*创建帧复制作业*/
fcAttrs.accel = true;
HFC = Frameccopy_create (&fcAttrs);
if (HFC == NULL){
ERR("创建框架复制作业失败");
清理(thread_failure);
}
hTime = time_create (&T);
if (hTime == NULL){
ERR("创建时间对象失败\n");
清理(thread_failure);
}
if (time_reset (hTime)!= DMI_eok){
ERR("重置计时器失败");
清理(thread_failure);
}
/*指示初始化已完成并等待其他线程*/
Rendezveze_meet (envp->hRendezvouszvInit);
while (!gblGetQuit()){
/*暂停处理? *
pause_test (envp->hPauseProcess);
/*暂停加油? *
pause_test (envp->hPausePrime);
/*获取解码视频帧*/
fifoRet = FIFO_GET (envp->hInFifo、&hSrcBuf);
如果(fifoRet < 0){
ERR("无法从视频线程获取缓冲区\n");
清理(thread_failure);
}
/*视频线程是否刷新了 FIFO? *
if (fifoRet = DMI_EFLUSH){
清理(thread_Success);
}
BufferGfx_getDimensions (hSrcBuf、&srcDim);
printf ("%d line @%s\n"、__line__、__file__);fflush (stdout);
#if 1//mach
/*从显示设备驱动程序获取缓冲区*/
如果(Display_Get (hDisplay、&hDstBuf)< 0){
ERR("Failed to get display buffer\n");
清理(thread_failure);
}
#endif
BufferGfx_getDimensions (hDstBuf、&dstDim);
printf ("%d 行@%s\n"、__line__、__file__);fflush (stdout);
/*更改图像的位置使其居中*/
#if 0// mach
if (srcDim.width!=削波宽度|| srcDim.height!=削波高度){
削波宽度= srcDid.width;
削波高度= srcDid.height;
/*更新用户界面的全局数据*/
gblSetImageWidth (srcDim.width);
gblSetImageHeight (srcDid.height);
/*如果剪切比屏幕宽,则剪切宽度和中心*/
if (srcDim.width > dstDim.width){
dstWidth = dstDid.width;
srcWidth = dstDid.width;
DSTX = 0;
}
否则{
dstWidth = srcDid.width;
srcWidth = srcDid.width;
DSTX =((dstDim.width - srcDim.width)/ 2)&~0xF;
}
/*如果剪辑高于屏幕,则夹紧高度*/
if (srcDim.height > dstDim.height){
dstHeight = dstDid.height;
srcHeight = dstDid.height;
DstY = 0;
}
否则{
dstHeight = srcDid.height;
srcHeight = srcDid.height;
DstY =(dstDim.height - srcDim.height)/ 2;
}
dstDim.x = dstX;
DstDim.y = dstY;
dstDid.width = dstWidth;
dstDid.height = dstHeight;
BufferGfx_setDimensions (hDstBuf、&dstDim);
srcDid.width = srcWidth;
srcDid.height = srcHeight;
BufferGfx_setDimensions (hSrcBuf、&srcDim);
if (Frameccopy_config (HFC、hSrcBuf、hDstBuf)< 0){
ERR("配置帧复制作业失败");
清理(thread_failure);
}
}
#endif
srcDid.width = srcWidth;
srcDid.height = srcHeight;
BufferGfx_setDimensions (hSrcBuf、&srcDim);
dstDid.width = dstWidth;
dstDid.height = dstHeight;
dstDim.x = dstX;
DstDim.y = dstY;
BufferGfx_setDimensions (hDstBuf、&dstDim);
/*将解码后的缓冲器从视频线程复制到显示屏。 *
if (Frameccopy_execute (HFC、hSrcBuf、hDstBuf)< 0){
ERR("执行帧复制作业失败");
清理(thread_failure);
}
#if 0//机器
if (envp->videoStd =VideoStd_720p_60){
if (time_delta (hTime、(uint32*)&time)< 0){
ERR("Failed to get timer delt\n");
清理(thread_failure);
}
WaitTime = DISPLAYLOOPLAATENCY -时间;
if (WaitTime > 0){
usleep(WaitTime);
}
if (time_reset (hTime)!= DMI_eok){
ERR("重置计时器失败");
清理(thread_failure);
}
}
BufferGfx_resetDimensions (hSrcBuf);
#endif
/*将缓冲区发送回视频线程*/
if (FIFO_Put (envp->hOutFifo、hSrcBuf)< 0){
ERR("无法将缓冲区发送到视频线程\n");
清理(thread_failure);
}
/*用户界面的增量统计信息*/
gblIncFrames();
#if 0//机器
BufferGfx_resetDimensions (hDstBuf);
/*将填充的缓冲区返回到显示设备驱动程序*/
if (Display_Put (hDisplay、hDstBuf)< 0){
ERR("Failed to put display buffer\n");
清理(thread_failure);
}
#endif
frameCnt++;
}
清理:
/*确保其他线程没有等待我们*/
Rendezvous _force (envp->hRendezvouszvInit);
pause_off (envp->hPauseProcess);
pause_off (envp->hPausePrime);
FIFO_FLUSH (envp->hOutFifo);
/*清洁前与其他螺纹接触*/
Rendezveze_meet (envp->hRendezvousCleanup);
/*在退出之前清理线程*/
如果(HFC){
Framecopy_delete (HFC);
}
if (hDisplay){
display_delete (hDisplay);
}
/*在退出之前清理线程*/
if (hBufTab){
BufTab_delete (hBufTab);
}
if (hTime){
time_delete (hTime);
}
返回状态;
}
来自解码器应用程序的 main.c。。。
/*
* main.c
*
*========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*版权所有(c) Texas Instruments Inc 2009
*
*本软件的使用受
*许可协议中提供或提供本软件的条款和条件的控制。
*====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "display.h"
#include "video.h"
#include "loader.h"
#include "help.h"
#include "main.h"
#include
/*初始化级别*/
#define LOGSINITIALIZED 0x1
#define DISPLAYTHREADCREATED 0x2
#define VIDEOTHREADCREATED 0x4
#define SPEECHTHREADCREATED 0x8
#define LOADERTHREADCREATED 0x10
/*线程优先级*/
#define LOADER_thread_Priority sched_get_priority_max (SCHED_FIFO)- 2
#define Speech _thread_priority sched_get_priority_max (SCHED_FIFO)- 2
#define VIDEO_THREAD_PRIORITY sched_get_Priority_max (SCHED_Output
Std_OUT_STUVideo_Output
Std);videocr_Output Std HD_FACT_RACf
*videoStdString;
字符 *speechFile;
Char *视频文件;
编解码器 *speechDecoder;
Codec *视频解码器;
内部 环路;
内部 键盘;
内置 时间;
内部 OSD;
内部 接口;
} args;
//定义无限时间*/
#define forever -1
#define DEFAULT_args{Display_Output_count、VideoStd_D1_NTSC、"D1 NTSC"、NULL、NULL、 null、NULL、\
false、false、forever、 false、false}
//此应用程序的全局变量声明*/
GlobalData GBL = GBL_DATA_init;
/*********
信号处理器
/
void signalHandler (int sig)
{
signal (SIGINT、SIG_DFL);
gblSetQuit();
}
/*********
*getCodec
/
静态编解码器*getCodec (Char *扩展、编解码器*编解码器)
{
编解码器*CODEC =空;
int i、j;
i = 0;
while (CODECODE[i]
。fileExtensions[j]){
if (strcmp (扩展、CODE[i]。fileExtensions[j])= 0+);CODECODECODECODECODE***
+++(CODECODECODECODEC)
*用法
/
静态空用法(void)
{
fprintf (stderr、"用法:解码[选项]\n\n"
"选项:\n""-s
|-speechfile 要播放的语音文件\n"-v
|--videofile 要播放的视频文件\n""-y|--display_standard
用于显示的视频标准(见下文)。\n""-O
|--display_output 要使用的视频输出(见下文)。\n"-k
|--keyboard" 启用键盘接口[OFF]\n"-t
|--time 运行演示的秒数[无限]\n"-l
|--loop 完成[Off]\n"-o
|--OSD 后,循环到文件开头 在 OSD [OFF]\n"-I
|--interface 上显示演示数据 退出[off]\n"-h
|--help 时启动演示界面 打印此消息\n"Video
standards available:\n"\t1\TD1
@ 30 fps (NTSC)[默认值]\n"\t2\TD1
@ 25 fps (PAL)\n"\t3\t720P
@ 60 fps
""Video outputs available:\n"\t复合
[默认值]\n"\n"</cn"
"</cn"
视频
文件扩展名"(至少为"720p 60 fps
)
*准标柱
/
静态空 parseArgs (int argc、char * argv[]、args * argsp)
{
const Char shortOptions[]="s:v:y:O:kt:lfoih";
const struct 选项 longOptions[]={
"speechfile"、 必需参数、NULL、"S"}、
{"videofile"、 必需参数、NULL、'v'}、
{"display_standard"、必需参数、 null、'y'}、
{"display_output"、required_argument、NULL、 'O'}、
{"键盘"、 no_argument、 空、"k"}、
{"time"、 必需参数、NULL、"t"}、
{"loop"、 no_argument、 空、'l'}、
{"osd"、 no_argument、 空、'o'}、
{"interface"、 no_argument、 空、'i'}、
{"help"、 no_argument、 null、'h'}、
{"exit"、 no_argument、 空、'e'}、
{0},0,0,0}
;
内部索引;
int c;
char *扩展名;
for (;){
c = getopt_long (argc、argv、shortOptions、longOptions、&index);
如果(c ==1){
中断;
}
开关(c){
案例0:
中断;
案例"S":
扩展名= rindex (optar、'.');
如果(扩展名=NULL){
fprintf (stderr),"无扩展名的语音文件:%s\n",
optarg);
EXIT (exit_failure)
;}fprintf (stechsps
(stderr
),"decoders->unknown (unexcodecoders->decoder
);#speedr\n?\(unexpirders->decodecodr
),#addr\n?\(unexpand_decodr)解码器扩展名),#es\(例如:#speedec)
argsp->speechFile = optarg;
break;
case 'v':
extension = rindex (optarg、'.');
if (extension = NULL){
fprintf (stderr、"无扩展名的视频文件:%s\n"、
optarg);
exit (exit_failure);
}video->decoder
= videoargr-
(videocodr
);#videodr (videocr) exceder = videocr、#videocr (if) excr、#videocr、#videocr- out (videoidrn)、#videocr、extension (videoidrn)、#videocrn) videocrn (if)、
交换机(atoi (optarg)){
案例1:
argsp->videoStd = VideoStd_D1_NTSC;
argsp->videoStdString ="D1 NTSC";
中断;
案例2:
argsp->60hz videoStd = VideoStd Std = VideoStd D1_videoStd;
argstd ="D1 "D1 720p";
中断;
案例3:720p =
60>VideoStd = 60gvideoStd;
视频
Std = 60gvideoT Std = 60_Std;videoT Std =
720p = 720p = 60_Std;视频串;视频 Std = 60gvideoT = 720p = 60_Std;videoid_Std = 720p = 720p = 720p = 60gvideoT;视频
argsp->videoStdString ="1080i 30Hz";
break;
case 6:
argsp->videoStd = VideoStd_1080i_25;
argsp->videoStdString ="1080i 25Hz";
break;
case 7:
argsp->videoStd = VideoStd_VGA;
argsp->videoStdsp="640x480";
displayed str\n"printfr";default sbr";display_fr"
usage();
exit (exit_failure);
}
break;
case 'O':
if (strcmp (optar,"component")=0){
argsp->displayOutput = Display_Output_component;
}else if (strcmp (optar,"composition")=0){ displayOutput
= Display_Output_component;}{\display_output_output};?br> out_out_display_outputs(output);{<display_output_failure=display_display_display_display_display_display_display_display_display_output)
;{<display_out_output};{<display_display_display_display_display_display_display_out};{<display_out_out_output}(display_out_
案例"k":
argsp->keyboard = true;
break;
案例"t":
argsp->time = atoi (optarg);
break;
案例"l":
argsp->loop = true;
break;
案例"o":
argsp->OSD = true;
break;
案例"i":
argsp->interface = true;
break;
case "opusage"
(
spruation"
(default);exit);exit (usage)(usage);exit (default)(usage):exit (默认用法:exit)
exit (exit_failure);
}
if (argsp->displayOutput == Display_Output_count){
if (argsp->videoStd =VideoStd_D1_NTSC)||(argsp->videoStd =VideoState_D1_Std){argsp->displayOutput=DisplayOut_Output_D1_解码
;
}else {(argsp->VideoOut_Out_Output_ideo}}}}}}{\}}}}{\}}{\}}{\*}{\*}{\}{\*}{\}{\}{\*}{\*}{\}{\*}{\}&}{\}{\}\*}{\*}\*}&
}
/*********
*主要内容
/
int main (int argc、char * argv[])
{
args args = DEFAULT_args;
Uns initMask = 0;
内部 状态 = EXIT_SUCCESS;
Pause_Attrs pAttrs = Pause_Attrs_default;
Rendezvous _Attrs rzvAttrs = Rendezvous _Attrs_default;
FIFO_Attrs fAttrs = FIFO_Attrs_default;
Rendezvous _ handle hRendezezvoInit =空;
Rendezvous _句柄 hRendezezvousCleanup =空;
Rendezvous _ handle hRendezvoLoop =空;
Rendezvous _句柄 hRendezvoLoader =空;
Pause_Handle h PauseProcess = NULL;
Pause_Handle h PausePrime =空;
整数 同步 = 0;
struct sched_param schparam;
pthread_attr_t 属性;
pthread_t displayThread;
pthread_t videoThread;
pthread_t speechThread;
pthread_t loaderThread;
LoaderEnv loaderEnv;
DisplayEnv DisplayEnv;
VideoEnv videoEnv;
内部 numThreads;
void * ret;
//将线程环境归零*/
dmi_clear (loaderEnv);
dmi_clear (displayEnv);
dmi_clear (videoEnv);
//解析提供给应用程序的参数并设置应用程序环境*/
parseArgs (argc、argv、&args);
printf ("demo started the_mutex"
;//初始化全局
mutex mutex 数据*/n.ptex);
//将整个进程的优先级设置为 max (需要 root 用户)*/
setpriority (PRIO_Process、0、-20);
//初始化编解码器引擎运行时间*/
CERUNTIME_INIT ();
//初始化 SIGINT 信号处理程序*/
SIGINT 信号(SIGINT、signalIZHandler);
//初始化 DaVinci 多媒体应用程序接口*/
DMI_BIT_INIT= INSIZE
;//初始化 INITSIMPL
/*创建暂停对象*/
hPauseProcess = Pause_create (&pAttrs);
hPausePrime = Pause_create (&pAttrs);
if (husePaProcess ==
线程|| hPausePrime =NULL){ERR ("创建暂停对象失败\n");cleanup (exit_failure);if (threption_threads =threads (numpts);things+(如果需要同步),则为 NULL);//确定视频线程数+ 3+(1)
if (args.speechFile){
numThreads +=1;
synctn++;
}//
创建同步线程初始化和清理的对象*/
hRendezvous Init = Rendezve_create (numThreads,&rendedAttrs);
hRzvCleanup = Rendedv_create (numvezvous、&rendvous Attrloop
= Rendedvous); &rzvAttrs);
hRendezvous Loader = Rendezvous _create (2,&rzvAttrs);
if (hRendezvous zvousInit =NULL || hRendezvous zvousCleanup == NULL ||
hRendezvous Loop == NULL);{("Initialize zvloader'/'tle_failure)'&rentr&trl'
('tle_init'&trl');'rendzvattle_attle_attle_attle&trl'(
如果
无法初始化,则无法退出)&trl'属性)
/*强制线程使用自定义调度属性*/
if (pthread_attr_setschedrheritsched (&attr, pthread_explicate_Sched)){ERR("
设置计划继承属性失败"));
clean(exit_failure);
}/*
将线程设置为 FIFO 实时调度*/
if (pthread_attr(){&sepattr()&sepo(fift&sep)
;将调度策略设置
为 FIFO 失败(setFIFO_failured(()(pther_sepo()(pth&sepo()(pthattr())))(pther&sep
//
如果提供了文件名,则创建视频线程*/ if (args.videoFile){/*
创建显示 FIFO */
displayEnv.hInFifo = FIFO_create (&fAttrs);
displayEnv.hOutFifo = FIFO_create (&fAttrs);
if (displayEnv.hIno = NULL);displayEnfifo
=无法
创建 FIFO";displayEnfifo = NULL);displayFIFOr =无法创建
//设置显示线程优先级*/
schedParam.sched_priority = display_thread_priority;
if (pthread_attr_setschedparam (&attr,&schedParam)){
ERR ("设置调度程序参数失败\n");
clean(exit_failure);
}
//创建显示线程*/
displayenv.displayOutput = args.displayOutput;
displayEnv.videoStd. = args.videoStd;
displayEnv.hRendezvousInit = hRendezvousInit;
displayEnv.hRendezvoCleanup = hRendezvoCleanup;
displayEnv.husePaProcess = hPauseProcess;
displayEnv.hPausePrime = hPausePrime;
displayEnv.OSD = args.OSD;
if (pthread_create (&displayThread、&attr、displayThrFxn、&displayEnv){
ERR ("无法创建显示线程\n");
clean(exit_failure);
}
initMask |= DISPLAYzvCREATED;
//设置视频优先级*/videoprendum_enchart
(&videoprer_encharge&r);param_param_enchargum_enchargum_enchargum_param_enchr (videoprelt)参数)
videoenv.hRenderzvoCleanup = hRenderzvoCleanup;
videoenv.hRenderzvoLoop = hRenderzvoLoop;
videoenv.hRenderzvoLoader = hRenderzvoLoader;
videoenv.hPauseProcess = hPauseProcess;
video.hPausePrime = hPausePrime;
videoenv.hDisplayInFifo = displayEnv.hInFifo;
video/hDisplayOutFifo = displayEnv.hOutFifo;
video/videoFile = args.videoFile;
videoenv.videoDecoder = args.videoDecoder->codecName;
videoenv.params = args.videoDecoder->params;
video/dynParams = args.videoDecoder->dynParams;
videoenv.loop = args.loop;
video/engineName =引擎->engineName;
videoenv.videoStd = args.videoStd;
if (pthread_create (&videoThread、&attr、videoThrFxn、&videoEnv){
ERR ("创建视频线程失败\n");
清理(EXIT_FAILURE);
}
initMask |= VIDEOTHREADCREATED;
//
*在
*启动加载程序线程之前,等待在视频加载程序中创建线程。
//
Rendezvezue_meet (hRendezvous Loader);
//设置加载程序线程优先级*/
schedParam.sched_priority = loader_thread_priority;
if (pthread_attr_setschedparam (&attr、&schedCleanup Param)){
ERR("Failed to set scheduler\n");
return -1;
}
// endedzvenergeneenergoenov.energenuenov.enuenuenuenuenuenuenuenuv
= enuenuenuenuenuenuenuenuenuenuenuenuerzvenuenuenuenuenuer
= args.loop;
loaderEnv.hLoader = video_env.hLoader;
if (pthread_create (&loaderThread、&attr、loaderThrFxn、&loaderEnv){
ERR ("无法创建加载程序线程\n");
cleanup (exit_failure);
}
initMask |= LOADuseREADUSECREATED;
}
clean://
确保已暂停(
如果已停止)的 enezvRousedumption
(如果已
取消);(如果已取消)(如果已取消),
则为 Rendezvous (已取消)。
if (initMask & SPEECHTHREADCREATED){
if (pthread_join (speechThread、&ret)=0){
if (ret = thread_failure){
status = exit_failure;
}
}if (initMask & LOADERTHEREADCREATED){
if (pthread_join (loaderThread、status
= 0_failure=)
}(initMask & LOADERRET = ret_READ_FAILURE)})}(if (init_READ_FAILURE = 0_EXIT = 0_FAILURE
=
THRET IF (initMask & VIDEOTHREADCREATED){
if (pthread_join (videoThread、&ret)=0){
if (rete_failure= thread_failure){
status = exit_failure;
}
}if (initMask & DISPLAYREADCREATED){
if (pthread_join (displayThread、displayThread、status
= 0_failure=)
}={ret_failure=}
如果(displayEnv.hOutFifo){FIFO_DELETE (displayEnv.hOutFifo);}如果(displayEnv.hInFifo){FIFO_DELETE (displayEnv.hInFifo);}if (hRendezeeneeneeneousLoop){Rendezvusevous _delete (hRendezvzvousLoop);}if (displayRenderenv.hInzvousLoop);}(如果删除)(RhendeneOutex)(ruselt)(/proc/sys/vm/drop_caches 如果删除)、则删除);}rtex (如果删除)(如果删除)、则删除)(如果(ruseneOutruseneOutex (ruseneOuth)(如果)、则删除)、则删除);(ruseneOutx (如果删除)(ruseneOutx (如果)、则删除)(如果)、则删除)、则删除)(如果(ruseneOutx (ruseneOutx (如果)、则)(
if (args.interface){
//退出时启动演示选择接口
(execl ("../interface"、"interface"、"-l 4"、(char *) NULL)=-1){
status = exit_failure;
}
}
exit (status);
}
原理图 是……
提示中的 dmesg 提示。 (我不知道为什么 printk (Kern_debug...) 省略 logicpd 器件驱动程序函数的某些前缀。)
-------------------------- 8<-------------------------- 8<------------------------------
Linux 版本2.6.18_pro500-DaVinci_IPNC_DM365_2.0.0 (root@localhost.locaμ m ldomain)(gcc 版本4.2.0 (MontaVista 4.2.0-16.0.32.080191)
4 2008-08-30))#1抢先于2018年1月25日16:29:27 KST
CPU:ARM926EJ-S [41069265]修订版5 (ARMv5TEJ)、CR=00053177
机器:达芬奇 DM365 IPNC
存储器策略:ECC 禁用、数据高速缓存写回
在节点0上总页:19456
DMA 区域:19456页、LIFO 批处理:3
达芬奇 DM0365变体0x8
PLL0:Fixedrate:24000000、commonrate:135000000、vpssrate:270000000
PLL0:vencrate_sd:27000000、ddrrate:270000000 mmcsdrate:135000000
PLL1:armrate:297000000、voicerate:20482758、vencrate _HD:74250000
CPU0:D VIVT 写回缓存
CPU0:I cache:16384字节、关联性4、32字节行、128集
CPU0:D 高速缓存:8192字节、关联性4、32字节行、64组
构建1个区域列表。 总页数:19456页
内核命令行:MEM=76m console=ttyS1,115200n8 root=/dev/ram0 rw initrd =0x82000000,9M IP=none DM365_imp.oper_mode=0 video =davinc
IFB:vid0=640x480x16@0、0:vid1=640x480x16@0、0:osd0=640x480x16@0、0:osd1=640x480x16@0、0 davinci_enc_mngr.ch0_mode=640x480 davinc_mng
r.ch0_output=LCD
PID 哈希表条目:512 (顺序:9、2048字节)
时钟事件器件 timer0_0配置、电容设置为:07
DEntry 高速缓存散列表条目:16384 (顺序:4、65536字节)
inode 高速缓存哈希表条目:8192 (顺序:3、32768字节)
内存:76MB =总共76MB
内存:64804KB 可用内存(2236K 代码、545K 数据、176K 初始化)
正在校准延迟环路... 148.27 BogoMips (lpj=741376)
挂载高速缓存散列表条目:512
CPU:测试写入缓冲区一致性:好的
检查图像是否为 initramfs...it 不是(错误的 gzip 幻数);看起来像 initrd
释放 initrd 内存:9216K
NET:注册协议系列16.
达芬奇:104个 GPIO IRQ
多路复用器:已初始化 GIO80_EXTCLK
多路复用器:已初始化 SPI0_SDENA1
DM365 IPIPE 在连续模式下初始化
通用 PHY:注册的新驱动程序
CH0默认输出"LCD"、模式"640x480"
be_encoder_setoutput>
将输出设置为复合
vpbe_encoder_setmode 的开始..
PBE_ENCODER_setMODE>
PBE_ENCODER_setoutput>
VPBE 编码器已初始化
be_encoder_enumoutput>
PBE_ENCODER_enumoutput>
be_encoder_enumoutput>
PBE_ENCODER_enumoutput>
be_encoder_enumoutput>
PBE_ENCODER_enumoutput>
be_encoder_getoutput>
PBE_ENCODER_getoutput>
be_encoder_getmode>
be_encoder_getmode/>
VPBE 编码器已初始化
VPBE 编码器已取消初始化
gicpd_encoder_setoutput>
logicpd_encoder_setmode 开始..
ogicpd_encoder_setoutput>
已初始化 LogicPD 编码器
gicpd_encoder_enumoutput>
ogicpd_encoder_enumoutput>
gicpd_encoder_setoutput>
logicpd_encoder_setmode 开始..
ogicpd_encoder_setoutput>
logicpd_encoder_setmode 开始..
gicpd_encoder_getoutput>
ogicpd_encoder_getoutput>
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
多路复用器:已初始化 GIO82_LCD_OE
多路复用器:已初始化 VOUT_HVSYNC
已初始化 LogicPD 编码器
多路复用器:已初始化 SD1_DATA0
NET:注册协议系列2.
IP 路由高速缓存哈希表条目:1024 (顺序:0、4096字节)
TCP 建立哈希表条目:4096 (顺序:2、16384字节)
TCP 绑定哈希表条目:2048 (顺序:1、8192字节)
TCP:配置哈希表(建立4096 BIND 2048)
TCP 重新注册
正在初始化加密 API
已注册 IO 调度程序 NOOP
IO 调度程序预期已注册(默认)
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
davincifb davincifb.0:dm_osd0_fb:640x480x16@0、0、帧缓冲区大小为600KB
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
davincifb davincifb.0:dm_vid0_fb:640x480x16@0、0、帧缓冲区大小为900KB
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
davincifb davincifb.0:dm_osd1_fb:640x480x16@0、0、帧缓冲区大小为600KB
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
davincifb davincifb.0:dm_vid1_fb:640x480x16@0、0、帧缓冲区大小为900KB
达芬奇 WDT:达芬奇看门狗计时器:心跳60秒
已初始化 IMP 串行器
已初始化 DaVinci_previewer
已初始化 DaVinci_resizer
串行:8250/16550驱动程序$Revision:1.90 $ 2端口,禁用 IRQ 共享
serial8250.0:MMIO 映射0x1c20000 mem 0xfbc20000 (IRQ = 40)上的 ttyS0是16550A
serial8250.0:MMIO 映射0x1d06000 mem 0xfbd06000 (IRQ = 41)处的 ttyS1为16550A
已初始化 ramdisk 驱动程序:1个9216K 大小512块大小的 RAM 磁盘
修复了 PHY:注册了新驱动程序
多路复用器:已初始化 SPI1_SCLK
达芬奇 EMAC MII 总线:探测
MAC 地址为死区
TI 达芬奇 EMAC Linux 版本更新了4.0
Linux 视频捕捉接口:v2.00
VPFE_INIT
多路复用器:已初始化 VOUT_COUTL_EN
多路复用器:已初始化 VOUT_COUTH_EN
正在启动 CCDC_RESET...<7>
CCDC_RESET...<5>VPFE_PROBE 结束
vinci_display_init>
尝试注册达芬奇显示视频设备。
lay=c28b6600、lay->video_dev=c28b6760
尝试注册达芬奇显示视频设备。
lay=c28b6400,lay->video_dev=c28b6560
DaVinci_init:加载了达芬奇 V4L2显示驱动程序 V1.0
avinci_init>
I2C /dev/entries 驱动程序
多路复用器:已初始化 GIO79_VCLK
达芬奇 MMC 达芬奇 MMC.0:支持4位模式
达芬奇 MMC 达芬奇 MMC.0:使用 DMA 模式
已注册 TCP BIC
NET:注册协议系列1
NET:注册协议系列17.
RAMDISK:在块0处找到 CRAMFS 文件系统
RAMDISK:正在将8548KiB [1 disk]加载到 RAM 磁盘... 6>时间:已安装 timer0_1时钟源。
时钟事件器件 timer0_0配置、电容设置为:08
在 CPU 0上切换到高分辨率模式
6>mmcblk0:mmc0:0001 00000 31260672KiB
完成。
mmcblk0:vfs:已安装的根(cramfs 文件系统)只读。
释放初始化内存:176K
P1
CMEMK 模块:构建于2017年10月27日19:37:37
参考 Linux 2.6.18版
文件/home/ciel/work/minienc/dvsdk_2_10_01_18/linuxutils_2_24_03/packages/ti/sdo/linuxutils/cmem/src/module/cmemk.c
分配了大小为0x1d2000的堆缓冲器0xc6000000
CMEM 范围与内核物理重叠-允许重叠
CMEM PHYS_START (0x1000)与内核重叠(0x8000000 -> 0x84c00000)
cmemk 已初始化
IRQK 模块:构建于2017年10月27日19:37:39
参考 Linux 2.6.18版
文件/home/ciel/work/minienc/dvsdk_2_10_01_18/linuxutils_2_24_03/packages/ti/sdo/linuxutils/irq/src/module/irqk.c
IRQk 已初始化
EDMAK 模块:构建于2017年10月27日19:37:38
参考 Linux 2.6.18版
文件/home/ciel/work/minienc/dvsdk_2_10_01_18/linuxutils_2_24_03/packages/ti/sdo/linuxutils/edma/src/module/edmak.c
be_encoder_enumoutput>
PBE_ENCODER_enumoutput>
be_encoder_enumoutput>
PBE_ENCODER_enumoutput>
be_encoder_enumoutput>
PBE_ENCODER_enumoutput>
gicpd_encoder_enumoutput>
ogicpd_encoder_enumoutput>
LogicPD 编码器已取消初始化
gicpd_encoder_setoutput>
logicpd_encoder_setmode 开始..
ogicpd_encoder_setoutput>
已初始化 LogicPD 编码器
gicpd_encoder_setoutput>
logicpd_encoder_setmode 开始..
ogicpd_encoder_setoutput>
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
gicpd_encoder_getoutput>
ogicpd_encoder_getoutput>
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
logicpd_encoder_setmode 开始..
无效 ID..
gicpd_encoder_getmode>
ogicpd_encoder_getmode>
