Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 94a26f9

Browse files
committedJun 21, 2024·
[Decode] Test shared surface copy between two media instances
Signed-off-by: Xu, Zhengguo <[email protected]>
1 parent 29c0a92 commit 94a26f9

File tree

3 files changed

+187
-1
lines changed

3 files changed

+187
-1
lines changed
 

‎decode/Makefile.am

+5-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2121
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2222

23-
bin_PROGRAMS = mpeg2vldemo loadjpeg
23+
bin_PROGRAMS = mpeg2vldemo loadjpeg vacopysharedsurface
2424

2525
AM_CPPFLAGS = \
2626
-Wall \
@@ -40,6 +40,10 @@ TEST_LIBS = \
4040
mpeg2vldemo_LDADD = $(TEST_LIBS)
4141
mpeg2vldemo_SOURCES = mpeg2vldemo.cpp
4242

43+
vacopysharedsurface_LDADD = $(TEST_LIBS)
44+
vacopysharedsurface_SOURCES = vacopysharedsurface.cpp
45+
46+
4347
loadjpeg_LDADD = $(TEST_LIBS)
4448
loadjpeg_SOURCES = loadjpeg.c tinyjpeg.c
4549

‎decode/meson.build

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
executable('mpeg2vldemo', [ 'mpeg2vldemo.cpp' ],
22
dependencies: libva_display_dep,
33
install: true)
4+
executable('vacopysharedsurface', [ 'vacopysharedsurface.cpp' ],
5+
dependencies: libva_display_dep,
6+
install: true)
47
executable('loadjpeg', [ 'loadjpeg.c', 'tinyjpeg.c' ],
58
dependencies: libva_display_dep,
69
install: true)

‎decode/vacopysharedsurface.cpp

+179
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
/*
2+
* Copyright (c) 2024 Intel Corporation. All Rights Reserved.
3+
*
4+
* Permission is hereby granted, free of charge, to any person obtaining a
5+
* copy of this software and associated documentation files (the
6+
* "Software"), to deal in the Software without restriction, including
7+
* without limitation the rights to use, copy, modify, merge, publish,
8+
* distribute, sub license, and/or sell copies of the Software, and to
9+
* permit persons to whom the Software is furnished to do so, subject to
10+
* the following conditions:
11+
*
12+
* The above copyright notice and this permission notice (including the
13+
* next paragraph) shall be included in all copies or substantial portions
14+
* of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17+
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19+
* IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20+
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22+
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23+
*/
24+
25+
#include <stdio.h>
26+
#include <string.h>
27+
#include <stdlib.h>
28+
#include <getopt.h>
29+
#include <unistd.h>
30+
#include <sys/types.h>
31+
#include <sys/stat.h>
32+
#include <fcntl.h>
33+
#include <assert.h>
34+
#include <va/va.h>
35+
#include <vector>
36+
#include <va/va_drm.h>
37+
#include "va_display.h"
38+
#include <time.h>
39+
#include <va/va_drmcommon.h>
40+
41+
#define CHECK_VASTATUS(va_status,func) \
42+
if (va_status != VA_STATUS_SUCCESS) { \
43+
fprintf(stderr,"%s:%s (%d) failed,exit\n", __func__, func, __LINE__); \
44+
exit(1); \
45+
}
46+
47+
48+
#define CLIP_WIDTH 1920
49+
#define CLIP_HEIGHT 1920
50+
51+
VADisplay openDriver(char *device_paths)
52+
{
53+
int drm_fd = open(device_paths, O_RDWR);
54+
if (drm_fd < 0)
55+
{
56+
printf("####INFO: device %s is invalid !\n", device_paths);
57+
return NULL;
58+
}
59+
60+
VADisplay va_dpy = vaGetDisplayDRM(drm_fd);
61+
if(va_dpy)
62+
return va_dpy;
63+
64+
close(drm_fd);
65+
drm_fd = -1;
66+
return 0;
67+
}
68+
69+
int main(int argc, char **argv)
70+
{
71+
VASurfaceID surface_id_0, surface_id_1, surface_id_2;
72+
int major_ver, minor_ver;
73+
VADisplay va_dpy_1, va_dpy_2;
74+
VAStatus va_status;
75+
76+
va_init_display_args(&argc, argv);
77+
va_dpy_1 = openDriver(argv[1]);
78+
va_status = vaInitialize(va_dpy_1, &major_ver, &minor_ver);
79+
assert(va_status == VA_STATUS_SUCCESS);
80+
81+
va_dpy_2 = openDriver(argv[1]);
82+
va_status = vaInitialize(va_dpy_2, &major_ver, &minor_ver);
83+
assert(va_status == VA_STATUS_SUCCESS);
84+
85+
////////////////////////////vaCopy in va_dpy_1////////////////////////////////
86+
va_status = vaCreateSurfaces(
87+
va_dpy_1,
88+
VA_RT_FORMAT_YUV420, CLIP_WIDTH, CLIP_HEIGHT,
89+
&surface_id_0, 1,
90+
NULL, 0
91+
);
92+
CHECK_VASTATUS(va_status, "vaCreateSurfaces");
93+
94+
va_status = vaCreateSurfaces(
95+
va_dpy_1,
96+
VA_RT_FORMAT_YUV420, CLIP_WIDTH, CLIP_HEIGHT,
97+
&surface_id_1, 1,
98+
NULL, 0
99+
);
100+
CHECK_VASTATUS(va_status, "vaCreateSurfaces");
101+
102+
//vaCopy
103+
VACopyObject dst;
104+
dst.obj_type = VACopyObjectSurface;
105+
dst.object.surface_id = surface_id_1;
106+
VACopyObject src;
107+
src.obj_type = VACopyObjectSurface;
108+
src.object.surface_id = surface_id_0;
109+
VACopyOption option;
110+
option.bits.va_copy_sync = VA_EXEC_SYNC;
111+
option.bits.va_copy_mode = VA_EXEC_MODE_DEFAULT;
112+
va_status = vaCopy(va_dpy_1, &dst, &src, option);
113+
CHECK_VASTATUS(va_status, "vaCopy");
114+
115+
//va_status = vaSyncSurface(va_dpy_1, surface_id_1);
116+
//CHECK_VASTATUS(va_status, "vaSyncSurface");
117+
118+
//vaExportSurface to get surface prime_fd
119+
VADRMPRIMESurfaceDescriptor desc;
120+
memset(&desc, 0, sizeof(VADRMPRIMESurfaceDescriptor));
121+
va_status = vaExportSurfaceHandle(va_dpy_1, surface_id_1, VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2, 0, &desc);
122+
////////////////////////////end vaCopy in va_dpy_1/////////////////////////////////////////////////////////////
123+
124+
////////////////////////////copy out surface from va_dpy_1 to another surface in va_dpy_2////////////
125+
////import surface from va_dpy_1 and create output surface
126+
VASurfaceAttrib surf_attrib[2];
127+
128+
surf_attrib[0].type = VASurfaceAttribMemoryType;
129+
surf_attrib[0].value.type = VAGenericValueTypeInteger;
130+
surf_attrib[0].flags = VA_SURFACE_ATTRIB_SETTABLE;
131+
surf_attrib[0].value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2;
132+
133+
surf_attrib[1].type = VASurfaceAttribExternalBufferDescriptor;
134+
surf_attrib[1].value.type = VAGenericValueTypePointer;
135+
surf_attrib[1].flags = VA_SURFACE_ATTRIB_SETTABLE;
136+
surf_attrib[1].value.value.p = &desc;
137+
va_status = vaCreateSurfaces(
138+
va_dpy_2,
139+
VA_RT_FORMAT_YUV420, CLIP_WIDTH, CLIP_HEIGHT,
140+
&surface_id_2, 1,
141+
surf_attrib, 2
142+
);
143+
CHECK_VASTATUS(va_status, "vaCreateSurfaces");
144+
145+
VASurfaceID surface_id_3;
146+
va_status = vaCreateSurfaces(
147+
va_dpy_2,
148+
VA_RT_FORMAT_YUV420, CLIP_WIDTH, CLIP_HEIGHT,
149+
&surface_id_3, 1,
150+
NULL, 0
151+
);
152+
CHECK_VASTATUS(va_status, "vaCreateSurfaces");
153+
154+
//vaCopy
155+
dst.obj_type = VACopyObjectSurface;
156+
dst.object.surface_id = surface_id_3;
157+
src.obj_type = VACopyObjectSurface;
158+
src.object.surface_id = surface_id_2;
159+
option.bits.va_copy_sync = VA_EXEC_SYNC;
160+
option.bits.va_copy_mode = VA_EXEC_MODE_DEFAULT;
161+
va_status = vaCopy(va_dpy_2, &dst, &src, option);
162+
CHECK_VASTATUS(va_status, "vaCopy");
163+
164+
va_status = vaSyncSurface(va_dpy_2, surface_id_2);
165+
va_status = vaSyncSurface(va_dpy_2, surface_id_3);
166+
CHECK_VASTATUS(va_status, "vaSyncSurface");
167+
////////////////////////////end copy//////////////////////////////////////////////////////////////////
168+
169+
vaDestroySurfaces(va_dpy_1, &surface_id_0, 1);
170+
vaDestroySurfaces(va_dpy_1, &surface_id_1, 1);
171+
vaDestroySurfaces(va_dpy_2, &surface_id_2, 1);
172+
vaDestroySurfaces(va_dpy_2, &surface_id_3, 1);
173+
174+
vaTerminate(va_dpy_1);
175+
vaTerminate(va_dpy_2);
176+
va_close_display(va_dpy_1);
177+
va_close_display(va_dpy_2);
178+
return 0;
179+
}

0 commit comments

Comments
 (0)
Please sign in to comment.