Home | History | Annotate | Download | only in vl
      1 /**************************************************************************
      2  *
      3  * Copyright 2009 Younes Manton.
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the
      8  * "Software"), to deal in the Software without restriction, including
      9  * without limitation the rights to use, copy, modify, merge, publish,
     10  * distribute, sub license, and/or sell copies of the Software, and to
     11  * permit persons to whom the Software is furnished to do so, subject to
     12  * the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the
     15  * next paragraph) shall be included in all copies or substantial portions
     16  * of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     21  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
     22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     25  *
     26  **************************************************************************/
     27 
     28 #include "pipe/p_video_codec.h"
     29 
     30 #include "util/u_video.h"
     31 
     32 #include "vl_decoder.h"
     33 #include "vl_mpeg12_decoder.h"
     34 
     35 bool
     36 vl_profile_supported(struct pipe_screen *screen, enum pipe_video_profile profile,
     37                      enum pipe_video_entrypoint entrypoint)
     38 {
     39    assert(screen);
     40    switch (u_reduce_video_profile(profile)) {
     41       case PIPE_VIDEO_FORMAT_MPEG12:
     42          return entrypoint != PIPE_VIDEO_ENTRYPOINT_ENCODE;
     43       default:
     44          return false;
     45    }
     46 }
     47 
     48 int
     49 vl_level_supported(struct pipe_screen *screen, enum pipe_video_profile profile)
     50 {
     51    assert(screen);
     52    switch (profile) {
     53       case PIPE_VIDEO_PROFILE_MPEG1:
     54          return 0;
     55       case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
     56       case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
     57          return 3;
     58       default:
     59          return 0;
     60    }
     61 }
     62 
     63 struct pipe_video_codec *
     64 vl_create_decoder(struct pipe_context *pipe,
     65                   const struct pipe_video_codec *templat)
     66 {
     67    unsigned width = templat->width, height = templat->height;
     68    struct pipe_video_codec temp;
     69    bool pot_buffers;
     70 
     71    assert(pipe);
     72    assert(width > 0 && height > 0);
     73 
     74    pot_buffers = !pipe->screen->get_video_param
     75    (
     76       pipe->screen,
     77       templat->profile,
     78       templat->entrypoint,
     79       PIPE_VIDEO_CAP_NPOT_TEXTURES
     80    );
     81 
     82    temp = *templat;
     83    temp.width = pot_buffers ? util_next_power_of_two(width) : align(width, VL_MACROBLOCK_WIDTH);
     84    temp.height = pot_buffers ? util_next_power_of_two(height) : align(height, VL_MACROBLOCK_HEIGHT);
     85 
     86    switch (u_reduce_video_profile(temp.profile)) {
     87       case PIPE_VIDEO_FORMAT_MPEG12:
     88          return vl_create_mpeg12_decoder(pipe, &temp);
     89 
     90       default:
     91          return NULL;
     92    }
     93    return NULL;
     94 }
     95