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