Skip to content

Commit 9f4210c

Browse files
committed
[Decode] Test shared surface copy between two media instances
Signed-off-by: Xu, Zhengguo <[email protected]>
1 parent 29c0a92 commit 9f4210c

File tree

3 files changed

+186
-1
lines changed

3 files changed

+186
-1
lines changed

decode/Makefile.am

Lines changed: 5 additions & 1 deletion
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

Lines changed: 3 additions & 0 deletions
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

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
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+
printf("####INFO: device %s is invalid !\n", device_paths);
56+
return NULL;
57+
}
58+
59+
VADisplay va_dpy = vaGetDisplayDRM(drm_fd);
60+
if (va_dpy)
61+
return va_dpy;
62+
63+
close(drm_fd);
64+
drm_fd = -1;
65+
return 0;
66+
}
67+
68+
int main(int argc, char **argv)
69+
{
70+
VASurfaceID surface_id_0, surface_id_1, surface_id_2;
71+
int major_ver, minor_ver;
72+
VADisplay va_dpy_1, va_dpy_2;
73+
VAStatus va_status;
74+
75+
va_init_display_args(&argc, argv);
76+
va_dpy_1 = openDriver(argv[1]);
77+
va_status = vaInitialize(va_dpy_1, &major_ver, &minor_ver);
78+
assert(va_status == VA_STATUS_SUCCESS);
79+
80+
va_dpy_2 = openDriver(argv[1]);
81+
va_status = vaInitialize(va_dpy_2, &major_ver, &minor_ver);
82+
assert(va_status == VA_STATUS_SUCCESS);
83+
84+
////////////////////////////vaCopy in va_dpy_1////////////////////////////////
85+
va_status = vaCreateSurfaces(
86+
va_dpy_1,
87+
VA_RT_FORMAT_YUV420, CLIP_WIDTH, CLIP_HEIGHT,
88+
&surface_id_0, 1,
89+
NULL, 0
90+
);
91+
CHECK_VASTATUS(va_status, "vaCreateSurfaces");
92+
93+
va_status = vaCreateSurfaces(
94+
va_dpy_1,
95+
VA_RT_FORMAT_YUV420, CLIP_WIDTH, CLIP_HEIGHT,
96+
&surface_id_1, 1,
97+
NULL, 0
98+
);
99+
CHECK_VASTATUS(va_status, "vaCreateSurfaces");
100+
101+
//vaCopy
102+
VACopyObject dst;
103+
dst.obj_type = VACopyObjectSurface;
104+
dst.object.surface_id = surface_id_1;
105+
VACopyObject src;
106+
src.obj_type = VACopyObjectSurface;
107+
src.object.surface_id = surface_id_0;
108+
VACopyOption option;
109+
option.bits.va_copy_sync = VA_EXEC_SYNC;
110+
option.bits.va_copy_mode = VA_EXEC_MODE_DEFAULT;
111+
va_status = vaCopy(va_dpy_1, &dst, &src, option);
112+
CHECK_VASTATUS(va_status, "vaCopy");
113+
114+
//va_status = vaSyncSurface(va_dpy_1, surface_id_1);
115+
//CHECK_VASTATUS(va_status, "vaSyncSurface");
116+
117+
//vaExportSurface to get surface prime_fd
118+
VADRMPRIMESurfaceDescriptor desc;
119+
memset(&desc, 0, sizeof(VADRMPRIMESurfaceDescriptor));
120+
va_status = vaExportSurfaceHandle(va_dpy_1, surface_id_1, VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2, 0, &desc);
121+
////////////////////////////end vaCopy in va_dpy_1/////////////////////////////////////////////////////////////
122+
123+
////////////////////////////copy out surface from va_dpy_1 to another surface in va_dpy_2////////////
124+
////import surface from va_dpy_1 and create output surface
125+
VASurfaceAttrib surf_attrib[2];
126+
127+
surf_attrib[0].type = VASurfaceAttribMemoryType;
128+
surf_attrib[0].value.type = VAGenericValueTypeInteger;
129+
surf_attrib[0].flags = VA_SURFACE_ATTRIB_SETTABLE;
130+
surf_attrib[0].value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2;
131+
132+
surf_attrib[1].type = VASurfaceAttribExternalBufferDescriptor;
133+
surf_attrib[1].value.type = VAGenericValueTypePointer;
134+
surf_attrib[1].flags = VA_SURFACE_ATTRIB_SETTABLE;
135+
surf_attrib[1].value.value.p = &desc;
136+
va_status = vaCreateSurfaces(
137+
va_dpy_2,
138+
VA_RT_FORMAT_YUV420, CLIP_WIDTH, CLIP_HEIGHT,
139+
&surface_id_2, 1,
140+
surf_attrib, 2
141+
);
142+
CHECK_VASTATUS(va_status, "vaCreateSurfaces");
143+
144+
VASurfaceID surface_id_3;
145+
va_status = vaCreateSurfaces(
146+
va_dpy_2,
147+
VA_RT_FORMAT_YUV420, CLIP_WIDTH, CLIP_HEIGHT,
148+
&surface_id_3, 1,
149+
NULL, 0
150+
);
151+
CHECK_VASTATUS(va_status, "vaCreateSurfaces");
152+
153+
//vaCopy
154+
dst.obj_type = VACopyObjectSurface;
155+
dst.object.surface_id = surface_id_3;
156+
src.obj_type = VACopyObjectSurface;
157+
src.object.surface_id = surface_id_2;
158+
option.bits.va_copy_sync = VA_EXEC_SYNC;
159+
option.bits.va_copy_mode = VA_EXEC_MODE_DEFAULT;
160+
va_status = vaCopy(va_dpy_2, &dst, &src, option);
161+
CHECK_VASTATUS(va_status, "vaCopy");
162+
163+
va_status = vaSyncSurface(va_dpy_2, surface_id_2);
164+
va_status = vaSyncSurface(va_dpy_2, surface_id_3);
165+
CHECK_VASTATUS(va_status, "vaSyncSurface");
166+
////////////////////////////end copy//////////////////////////////////////////////////////////////////
167+
168+
vaDestroySurfaces(va_dpy_1, &surface_id_0, 1);
169+
vaDestroySurfaces(va_dpy_1, &surface_id_1, 1);
170+
vaDestroySurfaces(va_dpy_2, &surface_id_2, 1);
171+
vaDestroySurfaces(va_dpy_2, &surface_id_3, 1);
172+
173+
vaTerminate(va_dpy_1);
174+
vaTerminate(va_dpy_2);
175+
va_close_display(va_dpy_1);
176+
va_close_display(va_dpy_2);
177+
return 0;
178+
}

0 commit comments

Comments
 (0)