Subversion Repositories Kolibri OS

Rev

Rev 6135 | Rev 6144 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6117 serge 1
#include 
2
#include 
3
#include 
4
#include 
5
#include 
6
#include 
7
#include 
8
#include 
9
#include 
10
#include 
11
#include 
12
#include 
13
#include "winlib/winlib.h"
14
#include "fplay.h"
15
 
16
struct hw_profile
17
{
18
    enum AVCodecID av_codec;
19
    int ff_profile;
6133 serge 20
    VAProfile va_profile;
6117 serge 21
};
22
 
23
 
24
#define ENTER()   printf("enter %s\n",__FUNCTION__)
25
#define LEAVE()   printf("leave %s\n",__FUNCTION__)
26
#define FAIL()    printf("fail %s\n",__FUNCTION__)
27
 
28
 
29
#if DEBUG
30
# define D(x) x
31
# define bug printf
32
#else
33
# define D(x)
34
#endif
35
 
36
#undef  ARRAY_ELEMS
37
#define ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
38
 
39
static int drm_fd = 0;
40
static struct vaapi_context *v_context;
41
 
6136 serge 42
static VASurfaceID v_surface_id[16];
6117 serge 43
 
44
#define HAS_HEVC VA_CHECK_VERSION(0, 38, 0)
45
#define HAS_VP9 (VA_CHECK_VERSION(0, 38, 1) && defined(FF_PROFILE_VP9_0))
46
 
47
#define PE(av_codec_id, ff_profile, vdp_profile)                \
48
    {AV_CODEC_ID_ ## av_codec_id, FF_PROFILE_ ## ff_profile,    \
49
     VAProfile ## vdp_profile}
50
 
6133 serge 51
static const struct hw_profile hw_profiles[] = {
6117 serge 52
    PE(MPEG2VIDEO,  MPEG2_MAIN,         MPEG2Main),
53
    PE(MPEG2VIDEO,  MPEG2_SIMPLE,       MPEG2Simple),
54
    PE(MPEG4,       MPEG4_ADVANCED_SIMPLE, MPEG4AdvancedSimple),
55
    PE(MPEG4,       MPEG4_MAIN,         MPEG4Main),
56
    PE(MPEG4,       MPEG4_SIMPLE,       MPEG4Simple),
57
    PE(H264,        H264_HIGH,          H264High),
58
    PE(H264,        H264_MAIN,          H264Main),
59
    PE(H264,        H264_BASELINE,      H264Baseline),
60
    PE(VC1,         VC1_ADVANCED,       VC1Advanced),
61
    PE(VC1,         VC1_MAIN,           VC1Main),
62
    PE(VC1,         VC1_SIMPLE,         VC1Simple),
63
    PE(WMV3,        VC1_ADVANCED,       VC1Advanced),
64
    PE(WMV3,        VC1_MAIN,           VC1Main),
65
    PE(WMV3,        VC1_SIMPLE,         VC1Simple),
66
#if HAS_HEVC
67
    PE(HEVC,        HEVC_MAIN,          HEVCMain),
68
    PE(HEVC,        HEVC_MAIN_10,       HEVCMain10),
69
#endif
70
#if HAS_VP9
71
    PE(VP9,         VP9_0,              VP9Profile0),
72
#endif
73
    {0}
74
};
75
 
76
int va_check_codec_support(enum AVCodecID id)
77
{
6133 serge 78
    for (int n = 0; hw_profiles[n].av_codec; n++) {
79
        if (hw_profiles[n].av_codec == id)
6117 serge 80
            return 1;
81
    }
82
    return 0;
83
}
84
 
85
static int vaapi_check_status(VAStatus status, const char *msg)
86
{
87
    if (status != VA_STATUS_SUCCESS) {
88
        fprintf(stderr, "[%s] %s: %s\n", PACKAGE_NAME, msg, vaErrorStr(status));
89
        return 0;
90
    }
91
    return 1;
92
};
93
 
94
static const char *string_of_VADisplayAttribType(VADisplayAttribType type)
95
{
96
    switch (type) {
97
#define TYPE(type) \
98
        case VADisplayAttrib##type: return "VADisplayAttrib" #type
99
        TYPE(Brightness);
100
        TYPE(Contrast);
101
        TYPE(Hue);
102
        TYPE(Saturation);
103
        TYPE(BackgroundColor);
104
#if !VA_CHECK_VERSION(0,34,0)
105
        TYPE(DirectSurface);
106
#endif
107
#if VA_CHECK_VERSION(0,32,0)
108
        TYPE(Rotation);
109
#endif
110
#undef TYPE
111
    default: break;
112
    }
113
    return "";
114
}
115
 
116
static const char *string_of_VAProfile(VAProfile profile)
117
{
118
    switch (profile) {
119
#define PROFILE(profile) \
120
        case VAProfile##profile: return "VAProfile" #profile
121
        PROFILE(MPEG2Simple);
122
        PROFILE(MPEG2Main);
123
        PROFILE(MPEG4Simple);
124
        PROFILE(MPEG4AdvancedSimple);
125
        PROFILE(MPEG4Main);
126
#if VA_CHECK_VERSION(0,32,0)
127
        PROFILE(JPEGBaseline);
128
        PROFILE(H263Baseline);
129
        PROFILE(H264ConstrainedBaseline);
130
#endif
131
        PROFILE(H264Baseline);
132
        PROFILE(H264Main);
133
        PROFILE(H264High);
134
        PROFILE(VC1Simple);
135
        PROFILE(VC1Main);
136
        PROFILE(VC1Advanced);
137
#undef PROFILE
138
    default: break;
139
    }
140
    return "";
141
}
142
 
143
static const char *string_of_VAEntrypoint(VAEntrypoint entrypoint)
144
{
145
    switch (entrypoint) {
146
#define ENTRYPOINT(entrypoint) \
147
        case VAEntrypoint##entrypoint: return "VAEntrypoint" #entrypoint
148
        ENTRYPOINT(VLD);
149
        ENTRYPOINT(IZZ);
150
        ENTRYPOINT(IDCT);
151
        ENTRYPOINT(MoComp);
152
        ENTRYPOINT(Deblocking);
153
#if VA_CHECK_VERSION(0,32,0)
154
        ENTRYPOINT(EncSlice);
155
        ENTRYPOINT(EncPicture);
156
#endif
157
#undef ENTRYPOINT
158
    default: break;
159
    }
160
    return "";
161
}
162
 
163
VADisplay va_open_display(void)
164
{
165
    VADisplay va_dpy;
166
 
167
    drm_fd = get_service("DISPLAY");
168
    if (drm_fd == 0)
169
        return NULL;
170
 
171
    va_dpy = vaGetDisplayDRM(drm_fd);
172
    if (va_dpy)
173
        return va_dpy;
174
 
175
    drm_fd = 0;
176
    return NULL;
177
};
178
 
6121 serge 179
void *vaapi_init(VADisplay display)
6117 serge 180
{
181
    struct vaapi_context *vaapi;
182
    int major_version, minor_version;
183
    int i, num_display_attrs, max_display_attrs;
184
    VADisplayAttribute *display_attrs = NULL;
185
    VAStatus status;
186
 
187
    if (v_context)
188
        return 0;
189
 
190
    if (!display)
191
        goto error;
192
    D(bug("VA display %p\n", display));
193
 
194
    status = vaInitialize(display, &major_version, &minor_version);
195
    if (!vaapi_check_status(status, "vaInitialize()"))
196
        goto error;
197
    D(bug("VA API version %d.%d\n", major_version, minor_version));
198
 
199
    max_display_attrs = vaMaxNumDisplayAttributes(display);
200
    display_attrs = malloc(max_display_attrs * sizeof(display_attrs[0]));
201
    if (!display_attrs)
202
        goto error;
203
 
204
    num_display_attrs = 0; /* XXX: workaround old GMA500 bug */
205
    status = vaQueryDisplayAttributes(display, display_attrs, &num_display_attrs);
206
    if (!vaapi_check_status(status, "vaQueryDisplayAttributes()"))
207
        goto error;
208
    D(bug("%d display attributes available\n", num_display_attrs));
209
    for (i = 0; i < num_display_attrs; i++) {
210
        VADisplayAttribute * const display_attr = &display_attrs[i];
211
        D(bug("  %-32s (%s/%s) min %d max %d value 0x%x\n",
212
              string_of_VADisplayAttribType(display_attr->type),
213
              (display_attr->flags & VA_DISPLAY_ATTRIB_GETTABLE) ? "get" : "---",
214
              (display_attr->flags & VA_DISPLAY_ATTRIB_SETTABLE) ? "set" : "---",
215
              display_attr->min_value,
216
              display_attr->max_value,
217
              display_attr->value));
218
    }
219
 
220
    if ((vaapi = calloc(1, sizeof(*vaapi))) == NULL)
221
        goto error;
6133 serge 222
    vaapi->display    = display;
223
    vaapi->config_id  = VA_INVALID_ID;
224
    vaapi->context_id = VA_INVALID_ID;
6117 serge 225
 
226
    v_context = vaapi;
227
 
6121 serge 228
    return vaapi;
6117 serge 229
 
230
error:
231
    free(display_attrs);
6121 serge 232
    return NULL;
6117 serge 233
}
234
 
235
static int has_profile(struct vaapi_context *vaapi, VAProfile profile)
236
{
237
    VAProfile *profiles;
238
    int        n_profiles;
239
    VAStatus   status;
240
    int i;
241
 
242
    profiles = calloc(vaMaxNumProfiles(vaapi->display), sizeof(profiles[0]));
243
 
244
    status = vaQueryConfigProfiles(vaapi->display,profiles,&n_profiles);
245
 
246
    if (!vaapi_check_status(status, "vaQueryConfigProfiles()"))
247
        return 0;
248
 
249
    D(bug("%d profiles available\n", n_profiles));
250
 
251
    for (i = 0; i < n_profiles; i++)
252
    {
253
        if (profiles[i] == profile)
254
            return 1;
255
    }
256
    return 0;
257
}
258
 
259
static int has_entrypoint(struct vaapi_context *vaapi, VAProfile profile, VAEntrypoint entrypoint)
260
{
261
    VAEntrypoint *entrypoints;
262
    int           n_entrypoints;
263
    VAStatus      status;
264
    int i;
265
 
266
    entrypoints = calloc(vaMaxNumEntrypoints(vaapi->display), sizeof(entrypoints[0]));
267
 
268
    status = vaQueryConfigEntrypoints(vaapi->display, profile,
269
                                      entrypoints, &n_entrypoints);
270
    if (!vaapi_check_status(status, "vaQueryConfigEntrypoints()"))
271
        return 0;
272
 
273
    D(bug("%d entrypoints available for %s\n", n_entrypoints,
274
          string_of_VAProfile(profile)));
275
 
276
    for (i = 0; i < n_entrypoints; i++)
277
    {
278
        if (entrypoints[i] == entrypoint)
279
            return 1;
280
    }
281
    return 0;
282
}
283
 
6136 serge 284
static int vaapi_init_decoder(vst_t *vst,VAProfile profile,
285
                              VAEntrypoint entrypoint,
286
                              unsigned int picture_width,
287
                              unsigned int picture_height)
6117 serge 288
{
289
    struct vaapi_context* const vaapi = v_context;
290
    VAConfigAttrib attrib;
291
    VAConfigID  config_id = VA_INVALID_ID;
292
    VAContextID context_id = VA_INVALID_ID;
293
    VAStatus status;
294
 
295
ENTER();
296
    if (!vaapi)
297
    {
298
        FAIL();
299
        return -1;
300
    };
301
 
302
    if (!has_profile(vaapi, profile))
303
    {
304
        FAIL();
305
        return -1;
306
    };
307
 
308
    if (!has_entrypoint(vaapi, profile, entrypoint))
309
    {
310
        FAIL();
311
        return -1;
312
    };
313
 
314
    if (vaapi->config_id != VA_INVALID_ID)
315
        vaDestroyConfig(vaapi->display, vaapi->config_id);
316
 
317
    attrib.type = VAConfigAttribRTFormat;
318
 
319
    printf("vaGetConfigAttributes\n");
320
    status = vaGetConfigAttributes(vaapi->display, profile, entrypoint,
321
                                   &attrib, 1);
322
    if (!vaapi_check_status(status, "vaGetConfigAttributes()"))
323
    {
324
        FAIL();
325
        return -1;
326
    }
327
 
328
    if ((attrib.value & VA_RT_FORMAT_YUV420) == 0)
329
    {
330
        printf("Chroma format not supported.\n");
331
        FAIL();
332
        return -1;
333
    };
334
 
335
    printf("vaCreateConfig\n");
336
    status = vaCreateConfig(vaapi->display, profile, entrypoint,
337
                            &attrib, 1, &config_id);
338
    if (!vaapi_check_status(status, "vaCreateConfig()"))
339
    {
340
        FAIL();
341
        return -1;
342
    }
343
 
344
    printf("vaCreateSurfaces %dx%d\n",picture_width,picture_height);
345
    status = vaCreateSurfaces(vaapi->display, VA_RT_FORMAT_YUV420, picture_width, picture_height,
6136 serge 346
                              v_surface_id,vst->nframes,NULL,0);
6117 serge 347
    if (!vaapi_check_status(status, "vaCreateSurfaces()"))
348
    {
349
        FAIL();
350
        return -1;
351
    };
352
    {
353
        VAImage vaimage;
354
        VABufferInfo info = {0};
355
 
356
        vaDeriveImage(vaapi->display,v_surface_id[0],&vaimage);
357
        printf("vaDeriveImage: %x  fourcc: %x\n"
358
               "offset0: %d pitch0: %d\n"
359
               "offset1: %d pitch1: %d\n"
360
               "offset2: %d pitch2: %d\n",
361
                vaimage.buf, vaimage.format.fourcc,
362
                vaimage.offsets[0],vaimage.pitches[0],
363
                vaimage.offsets[1],vaimage.pitches[1],
364
                vaimage.offsets[2],vaimage.pitches[2]);
365
 
366
        info.mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM;
367
        vaAcquireBufferHandle(vaapi->display, vaimage.buf, &info);
368
        printf("vaAcquireBufferHandle: %x type: %x\n"
369
                "mem type: %x mem size: %x\n",
370
                info.handle, info.type, info.mem_type, info.mem_size);
371
 
372
        vaReleaseBufferHandle(vaapi->display, vaimage.buf);
373
 
374
        vaDestroyImage(vaapi->display,vaimage.image_id);
375
    };
376
 
377
    printf("vaCreateContext %dx%d\n",picture_width,picture_height);
378
    status = vaCreateContext(vaapi->display, config_id,
379
                             picture_width, picture_height,
380
                             VA_PROGRESSIVE,
6136 serge 381
                             v_surface_id, vst->nframes,
6117 serge 382
                             &context_id);
383
    if (!vaapi_check_status(status, "vaCreateContext()"))
384
    {
385
        FAIL();
386
        return -1;
387
    };
388
 
6133 serge 389
    vaapi->config_id  = config_id;
390
    vaapi->context_id = context_id;
6117 serge 391
    LEAVE();
392
    return 0;
393
}
394
 
395
 
396
static enum PixelFormat get_format(struct AVCodecContext *avctx,
397
                                   const enum AVPixelFormat *fmt)
398
{
6136 serge 399
    vst_t *vst = (vst_t*)avctx->opaque;
6133 serge 400
    VAProfile profile = VAProfileNone;
6117 serge 401
 
402
 
6133 serge 403
    for (int i = 0; fmt[i] != PIX_FMT_NONE; i++)
404
    {
405
        enum AVCodecID codec = avctx->codec_id;
6117 serge 406
 
407
        if (fmt[i] != AV_PIX_FMT_VAAPI_VLD)
408
            continue;
409
 
6133 serge 410
        if (codec == AV_CODEC_ID_H264)
6117 serge 411
        {
6133 serge 412
            if (profile == FF_PROFILE_H264_CONSTRAINED_BASELINE)
413
                profile = FF_PROFILE_H264_MAIN;
414
        };
415
 
416
        for (int n = 0; hw_profiles[n].av_codec; n++)
417
        {
418
            if (hw_profiles[n].av_codec   == codec &&
419
                hw_profiles[n].ff_profile == avctx->profile)
6117 serge 420
            {
6133 serge 421
                profile = hw_profiles[n].va_profile;
6136 serge 422
                if (vaapi_init_decoder(vst, profile, VAEntrypointVLD, avctx->width, avctx->height) == 0)
6133 serge 423
                {
424
                    avctx->hwaccel_context = v_context;
425
                    return fmt[i]; ;
426
                }
6117 serge 427
            }
428
        }
6133 serge 429
 
6117 serge 430
    }
431
    return PIX_FMT_NONE;
432
}
433
 
434
struct av_surface
435
{
436
    int         w;
437
    int         h;
438
    VASurfaceID id;
439
};
440
 
441
static void av_release_buffer(void *opaque, uint8_t *data)
442
{
443
    struct av_surface surface = *(struct av_surface*)data;
444
    av_freep(&data);
445
}
446
 
447
static int get_buffer2(AVCodecContext *avctx, AVFrame *pic, int flags)
448
{
6118 serge 449
    vst_t *vst = (vst_t*)avctx->opaque;
6133 serge 450
    void *surface;
6117 serge 451
 
6133 serge 452
    surface = (void *)(uintptr_t)v_surface_id[vst->decoder_frame->index];
453
 
6117 serge 454
    pic->data[3] = surface;
455
 
456
    struct av_surface *avsurface;
457
    surface = av_malloc(sizeof(*avsurface));
458
    if (!surface)
459
        return AVERROR(ENOMEM);
460
 
461
    pic->buf[0] = av_buffer_create((uint8_t*)avsurface, sizeof(*avsurface),
462
                                     av_release_buffer, avctx,
463
                                     AV_BUFFER_FLAG_READONLY);
464
    return 0;
465
}
466
 
467
struct vaapi_context va_context_storage;
468
 
6118 serge 469
int fplay_init_context(vst_t *vst)
6117 serge 470
{
6118 serge 471
    AVCodecContext *vCtx = vst->vCtx;
6117 serge 472
 
6136 serge 473
    vst->nframes = 4;
474
 
6121 serge 475
    if(va_check_codec_support(vCtx->codec_id))
476
    {
477
        VADisplay dpy;
6117 serge 478
 
6121 serge 479
        dpy = va_open_display();
480
        vst->hwCtx = vaapi_init(dpy);
6117 serge 481
 
6121 serge 482
        if(vst->hwCtx != NULL)
483
        {
6136 serge 484
            if(vCtx->codec_id == AV_CODEC_ID_H264)
485
                vst->nframes = 16;
486
 
487
            for(int i = 0; i < vst->nframes; i++)
6121 serge 488
            {
6136 serge 489
                vframe_t *vframe = &vst->vframes[i];
6117 serge 490
 
6133 serge 491
                vframe->format    = AV_PIX_FMT_NONE;
492
                vframe->is_hw_pic = 1;
493
                vframe->index     = i;
494
                vframe->pts       = 0;
495
                vframe->ready     = 0;
496
                list_add_tail(&vframe->list, &vst->input_list);
6121 serge 497
            };
6117 serge 498
 
6121 serge 499
            vst->hwdec         = 1;
6136 serge 500
            vst->frame_reorder = 1;
6121 serge 501
            vCtx->opaque       = vst;
502
            vCtx->thread_count = 1;
503
            vCtx->get_format   = get_format;
504
            vCtx->get_buffer2  = get_buffer2;
505
            return 0;
506
        };
507
    };
6117 serge 508
 
6121 serge 509
    vst->hwdec = 0;
510
 
6136 serge 511
    for(int i = 0; i < vst->nframes; i++)
6121 serge 512
    {
6133 serge 513
        vframe_t *vframe;
6121 serge 514
        int ret;
515
 
6136 serge 516
        vframe = &vst->vframes[i];
6133 serge 517
 
518
        ret = avpicture_alloc(&vframe->picture, vst->vCtx->pix_fmt,
6121 serge 519
                               vst->vCtx->width, vst->vCtx->height);
520
        if ( ret != 0 )
521
        {
522
            printf("Cannot alloc video buffer\n\r");
523
            return ret;
524
        };
6133 serge 525
        vframe->format = vst->vCtx->pix_fmt;
526
        vframe->index  = i;
527
        vframe->pts    = 0;
528
        vframe->ready  = 0;
529
        list_add_tail(&vframe->list, &vst->input_list);
6121 serge 530
    };
531
 
6117 serge 532
    return 0;
533
}
534
 
6121 serge 535
 
6133 serge 536
#define EGL_TEXTURE_Y_U_V_WL            0x31D7
537
#define EGL_TEXTURE_Y_UV_WL             0x31D8
538
#define EGL_TEXTURE_Y_XUXV_WL           0x31D9
6117 serge 539
 
6133 serge 540
enum wl_drm_format {
541
    WL_DRM_FORMAT_C8 = 0x20203843,
542
    WL_DRM_FORMAT_RGB332 = 0x38424752,
543
    WL_DRM_FORMAT_BGR233 = 0x38524742,
544
    WL_DRM_FORMAT_XRGB4444 = 0x32315258,
545
    WL_DRM_FORMAT_XBGR4444 = 0x32314258,
546
    WL_DRM_FORMAT_RGBX4444 = 0x32315852,
547
    WL_DRM_FORMAT_BGRX4444 = 0x32315842,
548
    WL_DRM_FORMAT_ARGB4444 = 0x32315241,
549
    WL_DRM_FORMAT_ABGR4444 = 0x32314241,
550
    WL_DRM_FORMAT_RGBA4444 = 0x32314152,
551
    WL_DRM_FORMAT_BGRA4444 = 0x32314142,
552
    WL_DRM_FORMAT_XRGB1555 = 0x35315258,
553
    WL_DRM_FORMAT_XBGR1555 = 0x35314258,
554
    WL_DRM_FORMAT_RGBX5551 = 0x35315852,
555
    WL_DRM_FORMAT_BGRX5551 = 0x35315842,
556
    WL_DRM_FORMAT_ARGB1555 = 0x35315241,
557
    WL_DRM_FORMAT_ABGR1555 = 0x35314241,
558
    WL_DRM_FORMAT_RGBA5551 = 0x35314152,
559
    WL_DRM_FORMAT_BGRA5551 = 0x35314142,
560
    WL_DRM_FORMAT_RGB565 = 0x36314752,
561
    WL_DRM_FORMAT_BGR565 = 0x36314742,
562
    WL_DRM_FORMAT_RGB888 = 0x34324752,
563
    WL_DRM_FORMAT_BGR888 = 0x34324742,
564
    WL_DRM_FORMAT_XRGB8888 = 0x34325258,
565
    WL_DRM_FORMAT_XBGR8888 = 0x34324258,
566
    WL_DRM_FORMAT_RGBX8888 = 0x34325852,
567
    WL_DRM_FORMAT_BGRX8888 = 0x34325842,
568
    WL_DRM_FORMAT_ARGB8888 = 0x34325241,
569
    WL_DRM_FORMAT_ABGR8888 = 0x34324241,
570
    WL_DRM_FORMAT_RGBA8888 = 0x34324152,
571
    WL_DRM_FORMAT_BGRA8888 = 0x34324142,
572
    WL_DRM_FORMAT_XRGB2101010 = 0x30335258,
573
    WL_DRM_FORMAT_XBGR2101010 = 0x30334258,
574
    WL_DRM_FORMAT_RGBX1010102 = 0x30335852,
575
    WL_DRM_FORMAT_BGRX1010102 = 0x30335842,
576
    WL_DRM_FORMAT_ARGB2101010 = 0x30335241,
577
    WL_DRM_FORMAT_ABGR2101010 = 0x30334241,
578
    WL_DRM_FORMAT_RGBA1010102 = 0x30334152,
579
    WL_DRM_FORMAT_BGRA1010102 = 0x30334142,
580
    WL_DRM_FORMAT_YUYV = 0x56595559,
581
    WL_DRM_FORMAT_YVYU = 0x55595659,
582
    WL_DRM_FORMAT_UYVY = 0x59565955,
583
    WL_DRM_FORMAT_VYUY = 0x59555956,
584
    WL_DRM_FORMAT_AYUV = 0x56555941,
585
    WL_DRM_FORMAT_NV12 = 0x3231564e,
586
    WL_DRM_FORMAT_NV21 = 0x3132564e,
587
    WL_DRM_FORMAT_NV16 = 0x3631564e,
588
    WL_DRM_FORMAT_NV61 = 0x3136564e,
589
    WL_DRM_FORMAT_YUV410 = 0x39565559,
590
    WL_DRM_FORMAT_YVU410 = 0x39555659,
591
    WL_DRM_FORMAT_YUV411 = 0x31315559,
592
    WL_DRM_FORMAT_YVU411 = 0x31315659,
593
    WL_DRM_FORMAT_YUV420 = 0x32315559,
594
    WL_DRM_FORMAT_YVU420 = 0x32315659,
595
    WL_DRM_FORMAT_YUV422 = 0x36315559,
596
    WL_DRM_FORMAT_YVU422 = 0x36315659,
597
    WL_DRM_FORMAT_YUV444 = 0x34325559,
598
    WL_DRM_FORMAT_YVU444 = 0x34325659,
599
};
600
 
601
void va_create_planar(vst_t *vst, vframe_t *vframe)
6117 serge 602
{
6133 serge 603
    struct vaapi_context* const vaapi = v_context;
604
    VABufferInfo info = {0};
605
 
6117 serge 606
    VAImage vaimage;
607
    VAStatus status;
6133 serge 608
    planar_t *planar;
6117 serge 609
 
6133 serge 610
    vaSyncSurface(vaapi->display,v_surface_id[vframe->index]);
6117 serge 611
 
6133 serge 612
    if(vframe->format != AV_PIX_FMT_NONE)
613
        return;
614
 
615
    status = vaDeriveImage(vaapi->display,v_surface_id[vframe->index],&vaimage);
6117 serge 616
    if (!vaapi_check_status(status, "vaDeriveImage()"))
617
    {
618
        FAIL();
619
        return;
620
    };
6133 serge 621
/*
622
    printf("vaDeriveImage: %x  fourcc: %x\n"
623
           "offset0: %d pitch0: %d\n"
624
           "offset1: %d pitch1: %d\n"
625
           "offset2: %d pitch2: %d\n",
626
            vaimage.buf, vaimage.format.fourcc,
627
            vaimage.offsets[0],vaimage.pitches[0],
628
            vaimage.offsets[1],vaimage.pitches[1],
629
            vaimage.offsets[2],vaimage.pitches[2]);
630
*/
631
    info.mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM;
632
    status = vaAcquireBufferHandle(vaapi->display, vaimage.buf, &info);
633
    if (!vaapi_check_status(status, "vaAcquireBufferHandle()"))
6117 serge 634
    {
6133 serge 635
        vaDestroyImage(vaapi->display, vaimage.image_id);
6117 serge 636
        FAIL();
637
        return;
638
    };
6133 serge 639
/*
640
    printf("vaAcquireBufferHandle: %x type: %x\n"
641
            "mem type: %x mem size: %d\n",
642
            info.handle, info.type, info.mem_type, info.mem_size);
643
*/
644
    planar = pxCreatePlanar(info.handle, WL_DRM_FORMAT_NV12,
645
                            vaimage.width, vaimage.height,
646
                            vaimage.offsets[0],vaimage.pitches[0],
647
                            vaimage.offsets[1],vaimage.pitches[1],
648
                            vaimage.offsets[2],vaimage.pitches[2]);
649
    if(planar != NULL)
6117 serge 650
    {
6133 serge 651
        printf("create planar image\n",planar);
652
        vframe->planar = planar;
653
        vframe->format = AV_PIX_FMT_NV12;
6117 serge 654
    };
655
 
6133 serge 656
    vaReleaseBufferHandle(vaapi->display, vaimage.buf);
6117 serge 657
    vaDestroyImage(vaapi->display, vaimage.image_id);
6135 serge 658
 
6117 serge 659
}