1
checkMarkers(uint8_t * mark)2 static bool checkMarkers(uint8_t *mark)
3 {
4 if(mark[0]==0x11 && mark[800]==0x22 && mark[1600]==0x33) return true;
5 ADM_info("Markers do not check\n");
6 return false;
7 }
setMarkers(uint8_t * mark)8 static bool setMarkers(uint8_t *mark)
9 {
10 mark[0]=0x11;
11 mark[800]=0x22;
12 mark[1600]=0x33;
13 return true;
14 }
resetMarkers(uint8_t * mark)15 static bool resetMarkers(uint8_t *mark)
16 {
17 mark[0]=0x4;
18 mark[800]=0x5;
19 mark[1600]=0x6;
20 return true;
21 }
22
23
24 /**
25 * \fn tryDirectUpload
26 * @param title
27 * @param admSurface
28 * @param image
29 * @param image1
30 * @return
31 */
tryDirect(const char * title,ADM_vaSurface & admSurface,ADMImage & image1,ADMImage & image2)32 static bool tryDirect(const char *title, ADM_vaSurface &admSurface,ADMImage &image1, ADMImage &image2)
33 {
34 setMarkers(image1.GetWritePtr(PLANAR_Y));
35 resetMarkers(image2.GetWritePtr(PLANAR_Y));
36 if(false==admLibVA::admImageToSurface(&image1,&admSurface))
37 {
38 ADM_info("Direct upload failed\n");
39 return false;
40 }
41 if(false==admLibVA::surfaceToAdmImage(&image2,&admSurface))
42 {
43 ADM_info("Direct download failed\n");
44 return false;
45 }
46 if(!checkMarkers(image2.GetWritePtr(PLANAR_Y)))
47 {
48 ADM_info("Sanity check failed for direct operation\n");
49 return false;
50 }
51 ADM_info("Direct operation works\n") ;
52 return true;
53 }
54
55
56 /**
57 * \fn tryIndirectUpload
58 * @param title
59 * @param image
60 * @param image1
61 * @param image2
62 * @return
63 */
tryIndirectUpload(const char * title,ADM_vaSurface & admSurface,VAImage * image,ADMImage & image1)64 static bool tryIndirectUpload(const char *title, ADM_vaSurface &admSurface,VAImage *image, ADMImage &image1)
65 {
66 ADM_info("%s indirect upload... \n",title);
67 if(!admLibVA::uploadToImage(&image1,image))
68 {
69 ADM_info("Upload to yv12 image failed \n");
70 return false;
71 }
72 if(!admLibVA::imageToSurface(image,&admSurface))
73 {
74 ADM_info("image to surface failed\n");
75 return false;
76 }
77 return true;
78 }
79 /**
80 * \fn tryIndirectDownload
81 * @param title
82 * @param admSurface
83 * @param image
84 * @param image1
85 * @param image2
86 * @return
87 */
tryIndirectDownload(const char * title,ADM_vaSurface & admSurface,VAImage * image,ADMImage & image2)88 static bool tryIndirectDownload(const char *title, ADM_vaSurface &admSurface,VAImage *image, ADMImage &image2)
89 {
90 ADM_info("%s indirect download... \n",title);
91 if(!admLibVA::surfaceToImage(&admSurface,image))
92 {
93 ADM_info("Surface to image failed\n");
94 return false;
95 }
96 if(!admLibVA::downloadFromImage(&image2,image))
97 {
98 ADM_info("download from image failed\n");
99 return false;
100 }
101 if(! checkMarkers(image2.GetReadPtr(PLANAR_Y)))
102 {
103 ADM_info("sanity check failed\n");
104 return false;
105 }
106 return true;
107 }
108
109 /**
110 *
111 * @param title
112 * @param admSurface
113 * @param image
114 * @param image1
115 * @return
116 */
tryIndirect(bool isNv12,ADM_vaSurface & admSurface,ADMImage & image1,ADMImage & image2)117 static bool tryIndirect(bool isNv12, ADM_vaSurface &admSurface,ADMImage &image1, ADMImage &image2)
118 {
119 bool r=false;
120 ADM_info("Trying indirect transfer (%d)...\n",isNv12);
121 VAImage *image=NULL;
122 if(isNv12)
123 image=admLibVA::allocateNV12Image(640,400);
124 else
125 image=admLibVA::allocateYV12Image(640,400);
126 if(!image)
127 {
128 ADM_info("Cannot allocate image\n");
129 return false;
130 }
131 setMarkers(image1.GetReadPtr(PLANAR_Y));
132 resetMarkers(image2.GetReadPtr(PLANAR_Y));
133 if(false==tryIndirectUpload("-",admSurface,image, image1))
134 {
135 ADM_info(" indirect upload failed\n");
136 goto done;
137 }
138 if(false==tryIndirectDownload("-",admSurface,image,image2))
139 {
140 ADM_info(" indirect download failed\n");
141 goto done;
142 }
143 ADM_info("Works\n");
144 r=true;
145 done:
146 admLibVA::destroyImage(image);
147 image=NULL;
148 return r;
149 }
150