Software Archive
Read-only legacy content
17061 Discussions

Media Tips and Tricks

Gina_H_Intel
Employee
8,454 Views
 
0 Kudos
85 Replies
chuntian8577
Beginner
2,924 Views

We often watch interesting and wonderful videos on YouTube, but the problem is if I want to enjoy the videos from YouTube on my portable devices, what should I do and how can I do this?

Now with this powerful program-Cucusoft YouTube mate, which can help you download, play, convert and manage your favorite YouTube videos, now enjoy your favorite YouTube videos on your portable devices is so easy!

Make preparation: Download and install Cucusoft YouTube Mate

Part 1: How to play YouTube Videos on local hard disk.

Step1: Click "Add" Button .
Step2: Select the files you would like to play. You can select multiple files one time. All the files will be displayed in the play list.
Step3: Select one item you would like to play, click "Play" button to play it. Or, you can direct double click the clip in the play list.



Part 2: How to download YouTube Videos

Step1: Use an Internet Brower (IE, Firefox) to navigate YouTube. If you would like to download current YouTube Video, please go to Address Bar and press "Ctrl+C" to copy the URL in the Address Bar field.
Step2: Go to Cucusoft YouTube Mate, click "Download" Button, a download setting dialog will pop up. Please press "Ctrl+V" to paste previous URL in to Video URL field.
Step3: Click "OK" button, the download item will be added in the download list.
Step4: After the item status becomes "Downloading Done", you can play it offline or convert it to other video formats.



Part 3: How to Converter YouTube videos.

Step 1: Click "Add" Button to select the files you would like to convert. You can select multiple files one time. All the files will be displayed in the play list.
Step 2: Click "Profile" dropdown list to select a profile you need.
Step 3: If you need to set an new output folder, please click the "..." button right of "Output Folder" to select a new one.
Step 4: Click "Convert" button to start conversion..
In short while, the conversion will be finished.



If you want to get a more statisfactory enjoying of the Youtube video which has been convertered, now this tool- Aiseesoft Total Video Converter which have powerful video editting functions can meet your need.

Step 1: Download and install
Aiseesoft Total Video Converter




Step 2: Click "Add File" button to select the video you want to edit



The editting functions includes

1.Video Joiner.

If you want to merge several videos into one file you can choose them and click the "Merge into one file" to do it.



2.Video Cutter.

If you just want converter a clip of your video, then you can use the "Trim" icon to set the Start time and End time of the clip or you can directly drag the slide bar to the accurate position.



3.Video Crop

By using the "Crop" function you can crop the black edge of your video and you can also drag the line around the video image to adjust your video to portable devices..



4: Capture your favorite image.

If you like the current image of the video you can use the "Snapshot" option. Just click the "Snapshot" button the image will be saved and then click the "Open" button next to "Snapshot" button to open your picture.

Now you can easily enjoy your favorite YouTube videos on our portable devices, what are you waiting for? Just have a try and get a wonderful experience!
More:
Now many useful guides, tips, articles, tutorials are available on macsoftreviews. If you want to learn the tutorial about how to use a DVD Ripper, DVD Converter, Video Converter and so on. You can check the Helpful guide page.

0 Kudos
Quoc-Thai_L_Intel
2,924 Views
As there are more and more MID devices available in the market, there will always be a demand for content for them....Thanks for sharing this guide. Do you have any MID development that you could share in this forum? -Thai
0 Kudos
Quoc-Thai_L_Intel
2,924 Views
Thanks for sharing this guide. Do you have any MID development that you could share in this forum? -Thai
0 Kudos
pwakeford
Beginner
2,924 Views
Is there any command-line switch for existing Intel Proset utilities or the iframewrk.exe that will force a Wifi adapter to connect to a specified SSID? I have a scenario where I need to be able to switch between access points by clicking a script or application.

If not, is there a means to do this with the Mobile SDK with VB.Net?
0 Kudos
avensue
Beginner
2,924 Views
Excellent post... thanks a lot
0 Kudos
avensue
Beginner
2,924 Views
Great stuff buddy..... nice tips... thanks and keep it up
0 Kudos
Jianqiu_Chen
Beginner
2,924 Views
I tried google & intel.com it but not found. Where can i get it now.
0 Kudos
carlhop85
Beginner
2,924 Views
Hello,

I am Carl.This is my first visit to site.I am new to this site,but Ive enjoyed posting in your forums.I like your defination.You are doing very great work.In feature it will be benifited to all members.

Thank you very much and Stay connected with me.
0 Kudos
gressy
Beginner
2,924 Views

hi iam gerssy this is my first visit to site .Thanks for your information and good dafination.
0 Kudos
Rajkumar
Beginner
2,924 Views

Dear All,

I am working on Intel atom board (z530 1.60GHz) . Here I am trying to see the CPU utilization of mplayer with VAAPI support i followed steps given in below website
http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/

But while running application with ./mplayer -vo vaapi -va vaapi this option i am getting the following error

[vo_vaapi] vaInitialize(): invalid VADisplay
Error opening/initializing the selected video_out (-vo) device.

can any one give sugisition.

Thanks in advance

Regards
Raj

0 Kudos
blowdata4u
Beginner
2,924 Views
Added:

trunk/gar-minimyth/script/mediaplayers/vlc/files/vlc-1.0.0-rc4-vaapi.patch

Log:
- Added VLC VAAPI patch to the build system but did not include it in the
build.



Added:
trunk/gar-minimyth/script/mediaplayers/vlc/files/vlc-1.0.0-rc4-vaapi.patch
==============================================================================
--- (empty file)
+++
trunk/gar-minimyth/script/mediaplayers/vlc/files/vlc-1.0.0-rc4-vaapi.patch

Fri Jun 19 20:35:58 2009
@@ -0,0 +1,860 @@
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/avcodec.c
vlc-1.0.0-rc4-new/modules/codec/avcodec/avcodec.c
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/avcodec.c 2009-05-10
16:03:54.000000000 -0700
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/avcodec.c 2009-06-19
16:31:52.000000000 -0700
+@@ -129,6 +129,9 @@
+
+ add_integer( "ffmpeg-debug", 0, NULL, DEBUG_TEXT, DEBUG_LONGTEXT,
+ true )
++#ifdef HAVE_AVCODEC_VAAPI
++ add_bool( "ffmpeg-hw", true, NULL, HW_TEXT, HW_LONGTEXT, true )
++#endif
+
+ #ifdef ENABLE_SOUT
+ /* encoder submodule */
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/avcodec.h
vlc-1.0.0-rc4-new/modules/codec/avcodec/avcodec.h
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/avcodec.h 2009-05-10
16:03:54.000000000 -0700
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/avcodec.h 2009-06-19
16:31:52.000000000 -0700
+@@ -127,6 +127,9 @@
+ "usually has a detrimental effect on quality. However it provides a
big "
+ "speedup for high definition streams." )
+
++#define HW_TEXT N_("Hardware decoding")
++#define HW_LONGTEXT N_("This allows hardware decoding when available.")
++
+ /*
+ * Encoder options
+ */
+@@ -257,3 +260,6 @@
+ # define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c))
+ #endif
+
++/* Uncomment it to enable compilation with vaapi (you also must change
the build
++ * system) */
++//#define HAVE_AVCODEC_VAAPI 1
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/Modules.am
vlc-1.0.0-rc4-new/modules/codec/avcodec/Modules.am
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/Modules.am 2009-05-10
16:03:54.000000000 -0700
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/Modules.am 2009-06-19
16:31:52.000000000 -0700
+@@ -7,6 +7,7 @@
+ avutil.h
+ fourcc.c
+ chroma.c
++ vaapi.c
+ $(NULL)
+
+ if ENABLE_SOUT
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/vaapi.c
vlc-1.0.0-rc4-new/modules/codec/avcodec/vaapi.c
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/vaapi.c 1969-12-31
16:00:00.000000000 -0800
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/vaapi.c 2009-06-19
16:31:52.000000000 -0700
+@@ -0,0 +1,487 @@
++/*****************************************************************************
++ * vaapi.c: VAAPI helpers for the ffmpeg decoder
++
*****************************************************************************
++ * Copyright (C) 2009 Laurent Aimar
++ * $Id$
++ *
++ * Authors: Laurent Aimar
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
02110-1301, USA.
++
*****************************************************************************/
++
++#ifdef HAVE_CONFIG_H
++# include "config.h"
++#endif
++
++#include
++#include
++#include
++
++#ifdef HAVE_LIBAVCODEC_AVCODEC_H
++# include
++# include
++#elif defined(HAVE_FFMPEG_AVCODEC_H)
++# include
++#else
++# include
++#endif
++
++#include "avcodec.h"
++#include "vaapi.h"
++
++#ifdef HAVE_AVCODEC_VAAPI
++
++#include
++#include
++
++
++typedef struct
++{
++ VASurfaceID i_id;
++ int i_refcount;
++ unsigned int i_order;
++
++} vlc_va_surface_t;
++
++struct vlc_va_t
++{
++ /* */
++ Display *p_display_x11;
++ VADisplay p_display;
++
++ VAConfigID i_config_id;
++ VAContextID i_context_id;
++
++ struct vaapi_context hw_ctx;
++
++ /* */
++ int i_version_major;
++ int i_version_minor;
++
++ /* */
++ int i_surface_count;
++ unsigned int i_surface_order;
++ int i_surface_width;
++ int i_surface_height;
++ vlc_fourcc_t i_surface_chroma;
++
++ vlc_va_surface_t *p_surface;
++
++ VAImage image;
++
++};
++
++static int VaOpen( vlc_va_t *p_va, int i_codec_id );
++static void VaClose( vlc_va_t *p_va );
++
++static int VaCreateSurfaces( vlc_va_t *p_va, void **pp_hw_ctx,
vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height );
++static void VaDestroySurfaces( vlc_va_t *p_va );
++
++vlc_va_t *VaNew( int i_codec_id )
++{
++ vlc_va_t *p_va = calloc( 1, sizeof(*p_va) );
++ if( !p_va )
++ return NULL;
++
++ if( VaOpen( p_va, i_codec_id ) )
++ {
++ free( p_va );
++ return NULL;
++ }
++ return p_va;
++}
++void VaDelete( vlc_va_t *p_va )
++{
++ VaClose( p_va );
++ free( p_va );
++}
++int VaSetup( vlc_va_t *p_va, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height )
++{
++ if( p_va->i_surface_width == i_width &&
++ p_va->i_surface_height == i_height )
++ return VLC_SUCCESS;
++
++ *pp_hw_ctx = NULL;
++ *pi_chroma = 0;
++ if( p_va->i_surface_width || p_va->i_surface_height )
++ VaDestroySurfaces( p_va );
++
++ if( i_width > 0 && i_height > 0 )
++ return VaCreateSurfaces( p_va, pp_hw_ctx, pi_chroma, i_width,
i_height );
++
++ return VLC_EGENERIC;
++}
++void VaVersion( vlc_va_t *p_va, char *psz_version, size_t i_version )
++{
++ snprintf( psz_version, i_version, "%d.%d", p_va->i_version_major,
p_va->i_version_minor );
++}
++
++static int VaOpen( vlc_va_t *p_va, int i_codec_id )
++{
++ VAProfile i_profile;
++ int i_surface_count;
++
++ /* */
++ switch( i_codec_id )
++ {
++ case CODEC_ID_MPEG1VIDEO:
++ case CODEC_ID_MPEG2VIDEO:
++ i_profile = VAProfileMPEG2Main;
++ i_surface_count = 2+1;
++ break;
++ case CODEC_ID_MPEG4:
++ i_profile = VAProfileMPEG4AdvancedSimple;
++ i_surface_count = 2+1;
++ break;
++ case CODEC_ID_WMV3:
++ i_profile = VAProfileVC1Main;
++ i_surface_count = 2+1;
++ break;
++ case CODEC_ID_VC1:
++ i_profile = VAProfileVC1Advanced;
++ i_surface_count = 2+1;
++ break;
++ case CODEC_ID_H264:
++ i_profile = VAProfileH264High;
++ i_surface_count = 16+1;
++ break;
++ default:
++ return VLC_EGENERIC;
++ }
++
++ /* */
++ memset( p_va, 0, sizeof(*p_va) );
++
++ /* Create a VA display */
++ p_va->p_display_x11 = XOpenDisplay(NULL);
++ if( !p_va->p_display_x11 )
++ goto error;
++
++ p_va->p_display = vaGetDisplay( p_va->p_display_x11 );
++ if( !p_va->p_display )
++ goto error;
++
++ if( vaInitialize( p_va->p_display, &p_va->i_version_major,
&p_va->i_version_minor ) )
++ goto error;
++
++ /* Create a VA configuration */
++ VAConfigAttrib attrib;
++ memset( &attrib, 0, sizeof(attrib) );
++ attrib.type = VAConfigAttribRTFormat;
++ if( vaGetConfigAttributes( p_va->p_display,
++ i_profile, VAEntrypointVLD, &attrib, 1 ) )
++ goto error;
++
++ /* Not sure what to do if not, I don't have a way to test */
++ if( (attrib.value & VA_RT_FORMAT_YUV420) == 0 )
++ goto error;
++ if( vaCreateConfig( p_va->p_display,
++ i_profile, VAEntrypointVLD, &attrib, 1,
&p_va->i_config_id ) )
++ {
++ p_va->i_config_id = 0;
++ goto error;
++ }
++
++ p_va->i_surface_count = i_surface_count;
++
++ return VLC_SUCCESS;
++
++error:
++ return VLC_EGENERIC;
++}
++static void VaClose( vlc_va_t *p_va )
++{
++ if( p_va->i_surface_width || p_va->i_surface_height )
++ VaDestroySurfaces( p_va );
++
++ if( p_va->i_config_id )
++ vaDestroyConfig( p_va->p_display, p_va->i_config_id );
++ if( p_va->p_display )
++ vaTerminate( p_va->p_display );
++ if( p_va->p_display_x11 )
++ XCloseDisplay( p_va->p_display_x11 );
++}
++
++static int VaCreateSurfaces( vlc_va_t *p_va, void **pp_hw_ctx,
vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height )
++{
++ assert( i_width > 0 && i_height > 0 );
++
++ /* */
++ p_va->p_surface = calloc( p_va->i_surface_count,
sizeof(*p_va->p_surface) );
++ if( !p_va->p_surface )
++ return VLC_EGENERIC;
++
++ /* Create surfaces */
++ VASurfaceID pi_surface_id[p_va->i_surface_count];
++ if( vaCreateSurfaces( p_va->p_display, i_width, i_height,
VA_RT_FORMAT_YUV420,
++ p_va->i_surface_count, pi_surface_id ) )
++ {
++ for( int i = 0; i < p_va->i_surface_count; i++ )
++ p_va->p_surface.i_id = VA_INVALID_SURFACE;
++ goto error;
++ }
++
++ for( int i = 0; i < p_va->i_surface_count; i++ )
++ {
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ p_surface->i_id = pi_surface_id;
++ p_surface->i_refcount = 0;
++ p_surface->i_order = 0;
++ }
++
++ /* Create a context */
++ if( vaCreateContext( p_va->p_display, p_va->i_config_id,
++ i_width, i_height, VA_PROGRESSIVE,
++ pi_surface_id, p_va->i_surface_count,
&p_va->i_context_id ) )
++ {
++ p_va->i_context_id = 0;
++ goto error;
++ }
++
++ /* Find a supported image chroma */
++ int i_fmt_count = vaMaxNumImageFormats( p_va->p_display );
++ VAImageFormat *p_fmt = calloc( i_fmt_count, sizeof(*p_fmt) );
++ if( !p_fmt )
++ goto error;
++
++ if( vaQueryImageFormats( p_va->p_display, p_fmt, &i_fmt_count ) )
++ {
++ free( p_fmt );
++ goto error;
++ }
++
++ vlc_fourcc_t i_chroma = 0;
++ VAImageFormat fmt;
++ for( int i = 0; i < i_fmt_count; i++ )
++ {
++ if( p_fmt.fourcc == VA_FOURCC( 'Y', 'V', '1', '2' ) ||
++ p_fmt.fourcc == VA_FOURCC( 'I', '4', '2', '0' ) )
++ {
++ i_chroma = VLC_FOURCC( 'I', '4', '2', '0' );
++ fmt = p_fmt;
++ }
++ /* TODO: It seems that these may also be available (but not
++ * with my setup):
++ * VA_FOURCC( 'N', 'V', '1', '2')
++ * VA_FOURCC( 'U', 'Y', 'V', 'Y')
++ * VA_FOURCC( 'Y', 'U', 'Y', 'V')
++ */
++ }
++ free( p_fmt );
++ if( !i_chroma )
++ goto error;
++ *pi_chroma = i_chroma;
++
++ /* Create an image for surface extraction */
++ if( vaCreateImage( p_va->p_display, &fmt, i_width, i_height,
&p_va->image ) )
++ {
++ p_va->image.image_id = 0;
++ goto error;
++ }
++
++ /* Setup the ffmpeg hardware context */
++ *pp_hw_ctx = &p_va->hw_ctx;
++
++ memset( &p_va->hw_ctx, 0, sizeof(p_va->hw_ctx) );
++ p_va->hw_ctx.display = p_va->p_display;
++ p_va->hw_ctx.config_id = p_va->i_config_id;
++ p_va->hw_ctx.context_id = p_va->i_context_id;
++
++ /* */
++ p_va->i_surface_chroma = i_chroma;
++ p_va->i_surface_width = i_width;
++ p_va->i_surface_height = i_height;
++ return VLC_SUCCESS;
++
++error:
++ VaDestroySurfaces( p_va );
++ return VLC_EGENERIC;
++}
++static void VaDestroySurfaces( vlc_va_t *p_va )
++{
++ if( p_va->image.image_id )
++ vaDestroyImage( p_va->p_display, p_va->image.image_id );
++
++ if( p_va->i_context_id )
++ vaDestroyContext( p_va->p_display, p_va->i_context_id );
++
++ for( int i = 0; i < p_va->i_surface_count && p_va->p_surface; i++ )
++ {
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ if( p_surface->i_id != VA_INVALID_SURFACE )
++ vaDestroySurfaces( p_va->p_display, &p_surface->i_id, 1 );
++ }
++ free( p_va->p_surface );
++
++ /* */
++ p_va->image.image_id = 0;
++ p_va->i_context_id = 0;
++ p_va->p_surface = NULL;
++ p_va->i_surface_width = 0;
++ p_va->i_surface_height = 0;
++}
++
++int VaExtract( vlc_va_t *p_va, picture_t *p_picture, AVFrame *p_ff )
++{
++ VASurfaceID i_surface_id = (VASurfaceID)(uintptr_t)p_ff->data[3];
++
++ if( vaSyncSurface( p_va->p_display, p_va->i_context_id, i_surface_id
) )
++ return VLC_EGENERIC;
++
++ /* XXX vaDeriveImage may be better but it is not supported by
++ * my setup.
++ */
++
++ if( vaGetImage( p_va->p_display, i_surface_id,
++ 0, 0, p_va->i_surface_width, p_va->i_surface_height,
++ p_va->image.image_id) )
++ return VLC_EGENERIC;
++
++ void *p_base;
++ if( vaMapBuffer( p_va->p_display, p_va->image.buf, &p_base ) )
++ return VLC_EGENERIC;
++
++ for( int i_plane = 0; i_plane < p_picture->i_planes; i_plane++ )
++ {
++ const int i_src_plane = ((p_va->image.format.fourcc ==
VA_FOURCC('Y','V','1','2' )) && i_plane != 0) ? (3 - i_plane) : i_plane;
++ const uint8_t *p_src = (uint8_t*)p_base +
p_va->image.offsets[i_src_plane];
++ const int i_src_stride = p_va->image.pitches[i_src_plane];
++
++ uint8_t *p_dst = p_picture->p[i_plane].p_pixels;
++ const int i_dst_stride = p_picture->p[i_plane].i_pitch;
++
++ if( i_src_stride != i_dst_stride )
++ {
++ for( int i = 0; i < p_picture->p[i_plane].i_visible_lines;
i++ )
++ {
++ vlc_memcpy( p_dst, p_src, __MIN( i_src_stride,
i_dst_stride ) );
++ p_src += i_src_stride;
++ p_dst += i_dst_stride;
++ }
++ }
++ else
++ {
++ vlc_memcpy( p_dst, p_src,
p_picture->p[i_plane].i_visible_lines * i_src_stride );
++ }
++ }
++
++ if( vaUnmapBuffer( p_va->p_display, p_va->image.buf ) )
++ return VLC_EGENERIC;
++
++ return VLC_SUCCESS;
++}
++int VaGrabSurface( vlc_va_t *p_va, AVFrame *p_ff )
++{
++ int i_old;
++ int i;
++
++ /* Grab an unused surface, in case none are, try the oldest
++ * XXX using the oldest is a workaround in case a problem happens
with ffmpeg */
++ for( i = 0, i_old = 0; i < p_va->i_surface_count; i++ )
++ {
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ if( !p_surface->i_refcount )
++ break;
++
++ if( p_surface->i_order < p_va->p_surface[i_old].i_order )
++ i_old = i;
++ }
++ if( i >= p_va->i_surface_count )
++ i = i_old;
++
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ p_surface->i_refcount = 1;
++ p_surface->i_order = p_va->i_surface_order++;
++
++ /* */
++ for( int i = 0; i < 4; i++ )
++ {
++ p_ff->data = NULL;
++ p_ff->linesize = 0;
++
++ if( i == 0 || i == 3 )
++ p_ff->data = (void*)(uintptr_t)p_surface->i_id;/* Yummie */
++ }
++ return VLC_SUCCESS;
++}
++void VaUngrabSurface( vlc_va_t *p_va, AVFrame *p_ff )
++{
++ VASurfaceID i_surface_id = (VASurfaceID)(uintptr_t)p_ff->data[3];
++
++ for( int i = 0; i < p_va->i_surface_count; i++ )
++ {
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ if( p_surface->i_id == i_surface_id )
++ p_surface->i_refcount--;
++ }
++}
++
++#else
++
++vlc_va_t *VaNew( int i_codec_id )
++{
++ VLC_UNUSED(i_codec_id);
++ return NULL;
++}
++void VaDelete( vlc_va_t *p_va )
++{
++ VLC_UNUSED(p_va);
++ assert( 0 );
++}
++
++void VaVersion( vlc_va_t *p_va, char *psz_version, size_t i_version )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(psz_version); VLC_UNUSED(i_version);
++ assert(0);
++}
++
++int VaSetup( vlc_va_t *p_va, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(pp_hw_ctx); VLC_UNUSED(pi_chroma);
++ VLC_UNUSED(i_width); VLC_UNUSED(i_height);
++ assert(0);
++ return -1;
++}
++
++int VaExtract( vlc_va_t *p_va, picture_t *p_picture, AVFrame *p_ff )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(p_picture); VLC_UNUSED(p_ff);
++ assert(0);
++ return -1;
++}
++
++int VaGrabSurface( vlc_va_t *p_va, AVFrame *p_ff )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(p_ff);
++ assert(0);
++ return -1;
++}
++
++void VaUngrabSurface( vlc_va_t *p_va, AVFrame *p_ff )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(p_ff);
++ assert(0);
++}
++
++#endif
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/vaapi.h
vlc-1.0.0-rc4-new/modules/codec/avcodec/vaapi.h
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/vaapi.h 1969-12-31
16:00:00.000000000 -0800
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/vaapi.h 2009-06-19
16:31:52.000000000 -0700
+@@ -0,0 +1,43 @@
++/*****************************************************************************
++ * vaapi.h: VAAPI helpers for the ffmpeg decoder
++
*****************************************************************************
++ * Copyright (C) 2009 Laurent Aimar
++ * $Id$
++ *
++ * Authors: Laurent Aimar
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
02110-1301, USA.
++
*****************************************************************************/
++
++#ifndef _VLC_VAAPI_H
++#define _VLC_VAAPI_H 1
++
++typedef struct vlc_va_t vlc_va_t;
++
++vlc_va_t *VaNew( int i_codec_id );
++void VaDelete( vlc_va_t *p_va );
++
++void VaVersion( vlc_va_t *p_va, char *psz_version, size_t i_version );
++
++int VaSetup( vlc_va_t *p_va, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height );
++
++int VaExtract( vlc_va_t *p_va, picture_t *p_picture, AVFrame *p_ff );
++
++int VaGrabSurface( vlc_va_t *p_va, AVFrame *p_ff );
++
++void VaUngrabSurface( vlc_va_t *p_va, AVFrame *p_ff );
++
++#endif
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/video.c
vlc-1.0.0-rc4-new/modules/codec/avcodec/video.c
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/video.c 2009-06-14
11:14:59.000000000 -0700
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/video.c 2009-06-19
16:36:25.000000000 -0700
+@@ -34,10 +34,14 @@
+ #include
+ #include /* BITMAPINFOHEADER
*/
+ #include
++#include
+
+ /* ffmpeg header */
+ #ifdef HAVE_LIBAVCODEC_AVCODEC_H
+ # include
++# ifdef HAVE_AVCODEC_VAAPI
++# include
++# endif
+ #elif defined(HAVE_FFMPEG_AVCODEC_H)
+ # include
+ #else
+@@ -45,6 +49,7 @@
+ #endif
+
+ #include "avcodec.h"
++#include "vaapi.h"
+
+
/*****************************************************************************
+ * decoder_sys_t : decoder descriptor
+@@ -85,6 +90,9 @@
+
+ /* */
+ bool b_flush;
++
++ /* VA API */
++ vlc_va_t *p_va;
+ };
+
+ /* FIXME (dummy palette for now) */
+@@ -101,6 +109,10 @@
+ static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *, AVFrame * );
+ static void ffmpeg_NextPts( decoder_t * );
+
++static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *,
++ const enum PixelFormat * );
++
++
+ static uint32_t ffmpeg_CodecTag( vlc_fourcc_t fcc )
+ {
+ uint8_t *p = (uint8_t*)&fcc;
+@@ -115,7 +127,7 @@
+ static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec,
+ AVCodecContext *p_context )
+ {
+- picture_t *p_pic;
++ decoder_sys_t *p_sys = p_dec->p_sys;
+
+ p_dec->fmt_out.video.i_width = p_context->width;
+ p_dec->fmt_out.video.i_height = p_context->height;
+@@ -125,10 +137,12 @@
+ return NULL; /* invalid display size */
+ }
+
+- if( GetVlcChroma( &p_dec->fmt_out.video, p_context->pix_fmt ) !=
VLC_SUCCESS )
++ if( !p_sys->p_va && GetVlcChroma( &p_dec->fmt_out.video,
p_context->pix_fmt ) )
+ {
+- /* we are doomed, but not really, because most codecs set their
pix_fmt much later */
+- p_dec->fmt_out.i_codec = VLC_FOURCC('I','4','2','0');
++ /* we are doomed, but not really, because most codecs set their
pix_fmt
++ * much later
++ * FIXME does it make sense here ? */
++ p_dec->fmt_out.video.i_chroma = VLC_FOURCC('I','4','2','0');
+ }
+ p_dec->fmt_out.i_codec = p_dec->fmt_out.video.i_chroma;
+
+@@ -166,9 +180,7 @@
+ p_dec->fmt_out.video.i_frame_rate_base = p_context->time_base.num;
+ }
+
+- p_pic = decoder_NewPicture( p_dec );
+-
+- return p_pic;
++ return decoder_NewPicture( p_dec );
+ }
+
+
/*****************************************************************************
+@@ -193,6 +205,7 @@
+ p_sys->psz_namecodec = psz_namecodec;
+ p_sys->p_ff_pic = avcodec_alloc_frame();
+ p_sys->b_delayed_open = true;
++ p_sys->p_va = NULL;
+
+ /* ***** Fill p_context with init values ***** */
+ p_sys->p_context->codec_tag = ffmpeg_CodecTag( p_dec->fmt_in.i_codec
);
+@@ -319,6 +332,9 @@
+ p_sys->p_context->release_buffer = ffmpeg_ReleaseFrameBuf;
+ p_sys->p_context->opaque = p_dec;
+
++ if( var_CreateGetBool( p_dec, "ffmpeg-hw" ) )
++ p_sys->p_context->get_format = ffmpeg_GetFormat;
++
+ /* ***** misc init ***** */
+ p_sys->input_pts = p_sys->input_dts = 0;
+ p_sys->i_pts = 0;
+@@ -621,7 +637,7 @@
+ p_sys->i_late_frames = 0;
+ }
+
+- if( !b_drawpicture || !p_sys->p_ff_pic->linesize[0] )
++ if( !b_drawpicture || ( !p_sys->p_va
&& !p_sys->p_ff_pic->linesize[0] ) )
+ {
+ /* Do not display the picture */
+ p_pic = (picture_t *)p_sys->p_ff_pic->opaque;
+@@ -736,6 +752,9 @@
+
+ if( p_sys->p_ff_pic ) av_free( p_sys->p_ff_pic );
+ free( p_sys->p_buffer_orig );
++
++ if( p_sys->p_va )
++ VaDelete( p_sys->p_va );
+ }
+
+
/*****************************************************************************
+@@ -838,6 +857,14 @@
+
+ p_sys->b_delayed_open = false;
+
++ if( p_sys->p_va )
++ {
++ char psz_version[128];
++
++ VaVersion( p_sys->p_va, psz_version, sizeof(psz_version) );
++ msg_Info( p_dec, "Using VA API version %s for hardware
decoding.", psz_version );
++ }
++
+ return VLC_SUCCESS;
+ }
+
/*****************************************************************************
+@@ -849,7 +876,11 @@
+ {
+ decoder_sys_t *p_sys = p_dec->p_sys;
+
+- if( TestFfmpegChroma( p_sys->p_context->pix_fmt, -1 ) == VLC_SUCCESS )
++ if( p_sys->p_va )
++ {
++ VaExtract( p_sys->p_va, p_pic, p_ff_pic );
++ }
++ else if( TestFfmpegChroma( p_sys->p_context->pix_fmt, -1 ) ==
VLC_SUCCESS )
+ {
+ int i_plane, i_size, i_line;
+ uint8_t *p_dst, *p_src;
+@@ -899,11 +930,33 @@
+ ffmpeg_SetFrameBufferPts( p_dec, p_ff_pic );
+
+ /* */
+- p_ff_pic->opaque = 0;
++ p_ff_pic->opaque = NULL;
++
++ if( p_sys->p_va )
++ {
++ if( VaSetup( p_sys->p_va,
++ &p_sys->p_context->hwaccel_context,
&p_dec->fmt_out.video.i_chroma,
++ p_sys->p_context->width, p_sys->p_context->height ) )
++ {
++ msg_Err( p_dec, "VaSetup failed" );
++ return -1;
++ }
++
++ /* */
++ p_ff_pic->type = FF_BUFFER_TYPE_USER;
++ /* FIXME what is that, should give good value */
++ p_ff_pic->age = 256*256*256*64; // FIXME FIXME from ffmpeg
+
+- /* Not much to do in indirect rendering mode */
+- if( !p_sys->b_direct_rendering )
++ if( VaGrabSurface( p_sys->p_va, p_ff_pic ) )
++ {
++ msg_Err( p_dec, "VaGrabSurface failed" );
++ return -1;
++ }
++ return 0;
++ }
++ else if( !p_sys->b_direct_rendering )
+ {
++ /* Not much to do in indirect rendering mode */
+ return avcodec_default_get_buffer( p_context, p_ff_pic );
+ }
+
+@@ -1012,20 +1065,30 @@
+ AVFrame *p_ff_pic )
+ {
+ decoder_t *p_dec = (decoder_t *)p_context->opaque;
++ decoder_sys_t *p_sys = p_dec->p_sys;
++
++ if( p_sys->p_va )
++ {
++ VaUngrabSurface( p_sys->p_va, p_ff_pic );
+
+- if( !p_ff_pic->opaque )
++ /* */
++ for( int i = 0; i < 4; i++ )
++ p_ff_pic->data = NULL;
++ }
++ else if( !p_ff_pic->opaque )
+ {
+ avcodec_default_release_buffer( p_context, p_ff_pic );
+- return;
+ }
++ else
++ {
++ picture_t *p_pic = (picture_t*)p_ff_pic->opaque;
+
+- picture_t *p_pic = (picture_t*)p_ff_pic->opaque;
+- decoder_UnlinkPicture( p_dec, p_pic );
++ decoder_UnlinkPicture( p_dec, p_pic );
+
+- p_ff_pic->data[0] = NULL;
+- p_ff_pic->data[1] = NULL;
+- p_ff_pic->data[2] = NULL;
+- p_ff_pic->data[3] = NULL;
++ /* */
++ for( int i = 0; i < 4; i++ )
++ p_ff_pic->data = NULL;
++ }
+ }
+
+ static void ffmpeg_NextPts( decoder_t *p_dec )
+@@ -1052,3 +1115,53 @@
+ (2 * p_sys->p_context->time_base.den);
+ }
+ }
++
++static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *p_codec,
++ const enum PixelFormat *pi_fmt )
++{
++ decoder_t *p_dec = p_codec->opaque;
++ decoder_sys_t *p_sys = p_dec->p_sys;
++
++ if( p_sys->p_va )
++ {
++ VaDelete( p_sys->p_va );
++ p_sys->p_va = NULL;
++ }
++
++ /* Try too look for a supported hw acceleration */
++ for( int i = 0; pi_fmt != PIX_FMT_NONE; i++ )
++ {
++ static const char *ppsz_name[PIX_FMT_NB] = {
++ [PIX_FMT_VDPAU_H264] = "PIX_FMT_VDPAU_H264",
++ [PIX_FMT_VAAPI_IDCT] = "PIX_FMT_VAAPI_IDCT",
++ [PIX_FMT_VAAPI_VLD] = "PIX_FMT_VAAPI_VLD",
++ [PIX_FMT_VAAPI_MOCO] = "PIX_FMT_VAAPI_MOCO",
++ [PIX_FMT_YUYV422] = "PIX_FMT_YUYV422",
++ [PIX_FMT_YUV420P] = "PIX_FMT_YUV420P",
++ };
++ msg_Dbg( p_dec, "Available decoder output format %d (%s)",
pi_fmt, ppsz_name[pi_fmt] ?: "Unknown" );
++
++ /* Only VLD supported */
++ if( pi_fmt == PIX_FMT_VAAPI_VLD )
++ {
++ msg_Dbg( p_dec, "Trying VA API" );
++ p_sys->p_va = VaNew( p_sys->i_codec_id );
++ if( p_sys->p_va )
++ {
++ /* FIXME this will disabled direct rendering
++ * even if a new pixel format is renegociated
++ *
++ * FIXME Try to call VaSetup when possible
++ * to detect errors when possible (later is too late) */
++ p_sys->b_direct_rendering = false;
++ p_sys->p_context->draw_horiz_band = NULL;
++ return pi_fmt;
++ }
++ msg_Warn( p_dec, "Failed to open VA API" );
++ }
++ }
++
++ /* Fallback to default behaviour */
++ return avcodec_default_get_format( p_codec, pi_fmt );
++}
++

http://www.blowdata4u.com
0 Kudos
Rajkumar
Beginner
2,924 Views
Quoting - raj.ece03

Dear All,

I am working on Intel atom board (z530 1.60GHz) . Here I am trying to see the CPU utilization of mplayer with VAAPI support i followed steps given in below website
http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/

But while running application with ./mplayer -vo vaapi -va vaapi this option i am getting the following error

[vo_vaapi] vaInitialize(): invalid VADisplay
Error opening/initializing the selected video_out (-vo) device.

can any one give sugisition.

Thanks in advance

Regards
Raj


0 Kudos
Rajkumar
Beginner
2,924 Views
Quoting - raj.ece03
Quoting - raj.ece03

Dear All,

I am working on Intel atom board (z530 1.60GHz) . Here I am trying to see the CPU utilization of mplayer with VAAPI support i followed steps given in below website
http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/

But while running application with ./mplayer -vo vaapi -va vaapi this option i am getting the following error

[vo_vaapi] vaInitialize(): invalid VADisplay
Error opening/initializing the selected video_out (-vo) device.

can any one give sugisition.

Thanks in advance

Regards
Raj



0 Kudos
Rajkumar
Beginner
2,924 Views
Quoting - blowdata4u
Added:

trunk/gar-minimyth/script/mediaplayers/vlc/files/vlc-1.0.0-rc4-vaapi.patch

Log:
- Added VLC VAAPI patch to the build system but did not include it in the
build.



Added:
trunk/gar-minimyth/script/mediaplayers/vlc/files/vlc-1.0.0-rc4-vaapi.patch
==============================================================================
--- (empty file)
+++
trunk/gar-minimyth/script/mediaplayers/vlc/files/vlc-1.0.0-rc4-vaapi.patch

Fri Jun 19 20:35:58 2009
@@ -0,0 +1,860 @@
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/avcodec.c
vlc-1.0.0-rc4-new/modules/codec/avcodec/avcodec.c
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/avcodec.c 2009-05-10
16:03:54.000000000 -0700
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/avcodec.c 2009-06-19
16:31:52.000000000 -0700
+@@ -129,6 +129,9 @@
+
+ add_integer( "ffmpeg-debug", 0, NULL, DEBUG_TEXT, DEBUG_LONGTEXT,
+ true )
++#ifdef HAVE_AVCODEC_VAAPI
++ add_bool( "ffmpeg-hw", true, NULL, HW_TEXT, HW_LONGTEXT, true )
++#endif
+
+ #ifdef ENABLE_SOUT
+ /* encoder submodule */
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/avcodec.h
vlc-1.0.0-rc4-new/modules/codec/avcodec/avcodec.h
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/avcodec.h 2009-05-10
16:03:54.000000000 -0700
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/avcodec.h 2009-06-19
16:31:52.000000000 -0700
+@@ -127,6 +127,9 @@
+ "usually has a detrimental effect on quality. However it provides a
big "
+ "speedup for high definition streams." )
+
++#define HW_TEXT N_("Hardware decoding")
++#define HW_LONGTEXT N_("This allows hardware decoding when available.")
++
+ /*
+ * Encoder options
+ */
+@@ -257,3 +260,6 @@
+ # define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c))
+ #endif
+
++/* Uncomment it to enable compilation with vaapi (you also must change
the build
++ * system) */
++//#define HAVE_AVCODEC_VAAPI 1
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/Modules.am
vlc-1.0.0-rc4-new/modules/codec/avcodec/Modules.am
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/Modules.am 2009-05-10
16:03:54.000000000 -0700
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/Modules.am 2009-06-19
16:31:52.000000000 -0700
+@@ -7,6 +7,7 @@
+ avutil.h
+ fourcc.c
+ chroma.c
++ vaapi.c
+ $(NULL)
+
+ if ENABLE_SOUT
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/vaapi.c
vlc-1.0.0-rc4-new/modules/codec/avcodec/vaapi.c
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/vaapi.c 1969-12-31
16:00:00.000000000 -0800
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/vaapi.c 2009-06-19
16:31:52.000000000 -0700
+@@ -0,0 +1,487 @@
++/*****************************************************************************
++ * vaapi.c: VAAPI helpers for the ffmpeg decoder
++
*****************************************************************************
++ * Copyright (C) 2009 Laurent Aimar
++ * $Id$
++ *
++ * Authors: Laurent Aimar
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
02110-1301, USA.
++
*****************************************************************************/
++
++#ifdef HAVE_CONFIG_H
++# include "config.h"
++#endif
++
++#include
++#include
++#include
++
++#ifdef HAVE_LIBAVCODEC_AVCODEC_H
++# include
++# include
++#elif defined(HAVE_FFMPEG_AVCODEC_H)
++# include
++#else
++# include
++#endif
++
++#include "avcodec.h"
++#include "vaapi.h"
++
++#ifdef HAVE_AVCODEC_VAAPI
++
++#include
++#include
++
++
++typedef struct
++{
++ VASurfaceID i_id;
++ int i_refcount;
++ unsigned int i_order;
++
++} vlc_va_surface_t;
++
++struct vlc_va_t
++{
++ /* */
++ Display *p_display_x11;
++ VADisplay p_display;
++
++ VAConfigID i_config_id;
++ VAContextID i_context_id;
++
++ struct vaapi_context hw_ctx;
++
++ /* */
++ int i_version_major;
++ int i_version_minor;
++
++ /* */
++ int i_surface_count;
++ unsigned int i_surface_order;
++ int i_surface_width;
++ int i_surface_height;
++ vlc_fourcc_t i_surface_chroma;
++
++ vlc_va_surface_t *p_surface;
++
++ VAImage image;
++
++};
++
++static int VaOpen( vlc_va_t *p_va, int i_codec_id );
++static void VaClose( vlc_va_t *p_va );
++
++static int VaCreateSurfaces( vlc_va_t *p_va, void **pp_hw_ctx,
vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height );
++static void VaDestroySurfaces( vlc_va_t *p_va );
++
++vlc_va_t *VaNew( int i_codec_id )
++{
++ vlc_va_t *p_va = calloc( 1, sizeof(*p_va) );
++ if( !p_va )
++ return NULL;
++
++ if( VaOpen( p_va, i_codec_id ) )
++ {
++ free( p_va );
++ return NULL;
++ }
++ return p_va;
++}
++void VaDelete( vlc_va_t *p_va )
++{
++ VaClose( p_va );
++ free( p_va );
++}
++int VaSetup( vlc_va_t *p_va, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height )
++{
++ if( p_va->i_surface_width == i_width &&
++ p_va->i_surface_height == i_height )
++ return VLC_SUCCESS;
++
++ *pp_hw_ctx = NULL;
++ *pi_chroma = 0;
++ if( p_va->i_surface_width || p_va->i_surface_height )
++ VaDestroySurfaces( p_va );
++
++ if( i_width > 0 && i_height > 0 )
++ return VaCreateSurfaces( p_va, pp_hw_ctx, pi_chroma, i_width,
i_height );
++
++ return VLC_EGENERIC;
++}
++void VaVersion( vlc_va_t *p_va, char *psz_version, size_t i_version )
++{
++ snprintf( psz_version, i_version, "%d.%d", p_va->i_version_major,
p_va->i_version_minor );
++}
++
++static int VaOpen( vlc_va_t *p_va, int i_codec_id )
++{
++ VAProfile i_profile;
++ int i_surface_count;
++
++ /* */
++ switch( i_codec_id )
++ {
++ case CODEC_ID_MPEG1VIDEO:
++ case CODEC_ID_MPEG2VIDEO:
++ i_profile = VAProfileMPEG2Main;
++ i_surface_count = 2+1;
++ break;
++ case CODEC_ID_MPEG4:
++ i_profile = VAProfileMPEG4AdvancedSimple;
++ i_surface_count = 2+1;
++ break;
++ case CODEC_ID_WMV3:
++ i_profile = VAProfileVC1Main;
++ i_surface_count = 2+1;
++ break;
++ case CODEC_ID_VC1:
++ i_profile = VAProfileVC1Advanced;
++ i_surface_count = 2+1;
++ break;
++ case CODEC_ID_H264:
++ i_profile = VAProfileH264High;
++ i_surface_count = 16+1;
++ break;
++ default:
++ return VLC_EGENERIC;
++ }
++
++ /* */
++ memset( p_va, 0, sizeof(*p_va) );
++
++ /* Create a VA display */
++ p_va->p_display_x11 = XOpenDisplay(NULL);
++ if( !p_va->p_display_x11 )
++ goto error;
++
++ p_va->p_display = vaGetDisplay( p_va->p_display_x11 );
++ if( !p_va->p_display )
++ goto error;
++
++ if( vaInitialize( p_va->p_display, &p_va->i_version_major,
&p_va->i_version_minor ) )
++ goto error;
++
++ /* Create a VA configuration */
++ VAConfigAttrib attrib;
++ memset( &attrib, 0, sizeof(attrib) );
++ attrib.type = VAConfigAttribRTFormat;
++ if( vaGetConfigAttributes( p_va->p_display,
++ i_profile, VAEntrypointVLD, &attrib, 1 ) )
++ goto error;
++
++ /* Not sure what to do if not, I don't have a way to test */
++ if( (attrib.value & VA_RT_FORMAT_YUV420) == 0 )
++ goto error;
++ if( vaCreateConfig( p_va->p_display,
++ i_profile, VAEntrypointVLD, &attrib, 1,
&p_va->i_config_id ) )
++ {
++ p_va->i_config_id = 0;
++ goto error;
++ }
++
++ p_va->i_surface_count = i_surface_count;
++
++ return VLC_SUCCESS;
++
++error:
++ return VLC_EGENERIC;
++}
++static void VaClose( vlc_va_t *p_va )
++{
++ if( p_va->i_surface_width || p_va->i_surface_height )
++ VaDestroySurfaces( p_va );
++
++ if( p_va->i_config_id )
++ vaDestroyConfig( p_va->p_display, p_va->i_config_id );
++ if( p_va->p_display )
++ vaTerminate( p_va->p_display );
++ if( p_va->p_display_x11 )
++ XCloseDisplay( p_va->p_display_x11 );
++}
++
++static int VaCreateSurfaces( vlc_va_t *p_va, void **pp_hw_ctx,
vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height )
++{
++ assert( i_width > 0 && i_height > 0 );
++
++ /* */
++ p_va->p_surface = calloc( p_va->i_surface_count,
sizeof(*p_va->p_surface) );
++ if( !p_va->p_surface )
++ return VLC_EGENERIC;
++
++ /* Create surfaces */
++ VASurfaceID pi_surface_id[p_va->i_surface_count];
++ if( vaCreateSurfaces( p_va->p_display, i_width, i_height,
VA_RT_FORMAT_YUV420,
++ p_va->i_surface_count, pi_surface_id ) )
++ {
++ for( int i = 0; i < p_va->i_surface_count; i++ )
++ p_va->p_surface.i_id = VA_INVALID_SURFACE;
++ goto error;
++ }
++
++ for( int i = 0; i < p_va->i_surface_count; i++ )
++ {
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ p_surface->i_id = pi_surface_id;
++ p_surface->i_refcount = 0;
++ p_surface->i_order = 0;
++ }
++
++ /* Create a context */
++ if( vaCreateContext( p_va->p_display, p_va->i_config_id,
++ i_width, i_height, VA_PROGRESSIVE,
++ pi_surface_id, p_va->i_surface_count,
&p_va->i_context_id ) )
++ {
++ p_va->i_context_id = 0;
++ goto error;
++ }
++
++ /* Find a supported image chroma */
++ int i_fmt_count = vaMaxNumImageFormats( p_va->p_display );
++ VAImageFormat *p_fmt = calloc( i_fmt_count, sizeof(*p_fmt) );
++ if( !p_fmt )
++ goto error;
++
++ if( vaQueryImageFormats( p_va->p_display, p_fmt, &i_fmt_count ) )
++ {
++ free( p_fmt );
++ goto error;
++ }
++
++ vlc_fourcc_t i_chroma = 0;
++ VAImageFormat fmt;
++ for( int i = 0; i < i_fmt_count; i++ )
++ {
++ if( p_fmt.fourcc == VA_FOURCC( 'Y', 'V', '1', '2' ) ||
++ p_fmt.fourcc == VA_FOURCC( 'I', '4', '2', '0' ) )
++ {
++ i_chroma = VLC_FOURCC( 'I', '4', '2', '0' );
++ fmt = p_fmt;
++ }
++ /* TODO: It seems that these may also be available (but not
++ * with my setup):
++ * VA_FOURCC( 'N', 'V', '1', '2')
++ * VA_FOURCC( 'U', 'Y', 'V', 'Y')
++ * VA_FOURCC( 'Y', 'U', 'Y', 'V')
++ */
++ }
++ free( p_fmt );
++ if( !i_chroma )
++ goto error;
++ *pi_chroma = i_chroma;
++
++ /* Create an image for surface extraction */
++ if( vaCreateImage( p_va->p_display, &fmt, i_width, i_height,
&p_va->image ) )
++ {
++ p_va->image.image_id = 0;
++ goto error;
++ }
++
++ /* Setup the ffmpeg hardware context */
++ *pp_hw_ctx = &p_va->hw_ctx;
++
++ memset( &p_va->hw_ctx, 0, sizeof(p_va->hw_ctx) );
++ p_va->hw_ctx.display = p_va->p_display;
++ p_va->hw_ctx.config_id = p_va->i_config_id;
++ p_va->hw_ctx.context_id = p_va->i_context_id;
++
++ /* */
++ p_va->i_surface_chroma = i_chroma;
++ p_va->i_surface_width = i_width;
++ p_va->i_surface_height = i_height;
++ return VLC_SUCCESS;
++
++error:
++ VaDestroySurfaces( p_va );
++ return VLC_EGENERIC;
++}
++static void VaDestroySurfaces( vlc_va_t *p_va )
++{
++ if( p_va->image.image_id )
++ vaDestroyImage( p_va->p_display, p_va->image.image_id );
++
++ if( p_va->i_context_id )
++ vaDestroyContext( p_va->p_display, p_va->i_context_id );
++
++ for( int i = 0; i < p_va->i_surface_count && p_va->p_surface; i++ )
++ {
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ if( p_surface->i_id != VA_INVALID_SURFACE )
++ vaDestroySurfaces( p_va->p_display, &p_surface->i_id, 1 );
++ }
++ free( p_va->p_surface );
++
++ /* */
++ p_va->image.image_id = 0;
++ p_va->i_context_id = 0;
++ p_va->p_surface = NULL;
++ p_va->i_surface_width = 0;
++ p_va->i_surface_height = 0;
++}
++
++int VaExtract( vlc_va_t *p_va, picture_t *p_picture, AVFrame *p_ff )
++{
++ VASurfaceID i_surface_id = (VASurfaceID)(uintptr_t)p_ff->data[3];
++
++ if( vaSyncSurface( p_va->p_display, p_va->i_context_id, i_surface_id
) )
++ return VLC_EGENERIC;
++
++ /* XXX vaDeriveImage may be better but it is not supported by
++ * my setup.
++ */
++
++ if( vaGetImage( p_va->p_display, i_surface_id,
++ 0, 0, p_va->i_surface_width, p_va->i_surface_height,
++ p_va->image.image_id) )
++ return VLC_EGENERIC;
++
++ void *p_base;
++ if( vaMapBuffer( p_va->p_display, p_va->image.buf, &p_base ) )
++ return VLC_EGENERIC;
++
++ for( int i_plane = 0; i_plane < p_picture->i_planes; i_plane++ )
++ {
++ const int i_src_plane = ((p_va->image.format.fourcc ==
VA_FOURCC('Y','V','1','2' )) && i_plane != 0) ? (3 - i_plane) : i_plane;
++ const uint8_t *p_src = (uint8_t*)p_base +
p_va->image.offsets[i_src_plane];
++ const int i_src_stride = p_va->image.pitches[i_src_plane];
++
++ uint8_t *p_dst = p_picture->p[i_plane].p_pixels;
++ const int i_dst_stride = p_picture->p[i_plane].i_pitch;
++
++ if( i_src_stride != i_dst_stride )
++ {
++ for( int i = 0; i < p_picture->p[i_plane].i_visible_lines;
i++ )
++ {
++ vlc_memcpy( p_dst, p_src, __MIN( i_src_stride,
i_dst_stride ) );
++ p_src += i_src_stride;
++ p_dst += i_dst_stride;
++ }
++ }
++ else
++ {
++ vlc_memcpy( p_dst, p_src,
p_picture->p[i_plane].i_visible_lines * i_src_stride );
++ }
++ }
++
++ if( vaUnmapBuffer( p_va->p_display, p_va->image.buf ) )
++ return VLC_EGENERIC;
++
++ return VLC_SUCCESS;
++}
++int VaGrabSurface( vlc_va_t *p_va, AVFrame *p_ff )
++{
++ int i_old;
++ int i;
++
++ /* Grab an unused surface, in case none are, try the oldest
++ * XXX using the oldest is a workaround in case a problem happens
with ffmpeg */
++ for( i = 0, i_old = 0; i < p_va->i_surface_count; i++ )
++ {
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ if( !p_surface->i_refcount )
++ break;
++
++ if( p_surface->i_order < p_va->p_surface[i_old].i_order )
++ i_old = i;
++ }
++ if( i >= p_va->i_surface_count )
++ i = i_old;
++
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ p_surface->i_refcount = 1;
++ p_surface->i_order = p_va->i_surface_order++;
++
++ /* */
++ for( int i = 0; i < 4; i++ )
++ {
++ p_ff->data = NULL;
++ p_ff->linesize = 0;
++
++ if( i == 0 || i == 3 )
++ p_ff->data = (void*)(uintptr_t)p_surface->i_id;/* Yummie */
++ }
++ return VLC_SUCCESS;
++}
++void VaUngrabSurface( vlc_va_t *p_va, AVFrame *p_ff )
++{
++ VASurfaceID i_surface_id = (VASurfaceID)(uintptr_t)p_ff->data[3];
++
++ for( int i = 0; i < p_va->i_surface_count; i++ )
++ {
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ if( p_surface->i_id == i_surface_id )
++ p_surface->i_refcount--;
++ }
++}
++
++#else
++
++vlc_va_t *VaNew( int i_codec_id )
++{
++ VLC_UNUSED(i_codec_id);
++ return NULL;
++}
++void VaDelete( vlc_va_t *p_va )
++{
++ VLC_UNUSED(p_va);
++ assert( 0 );
++}
++
++void VaVersion( vlc_va_t *p_va, char *psz_version, size_t i_version )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(psz_version); VLC_UNUSED(i_version);
++ assert(0);
++}
++
++int VaSetup( vlc_va_t *p_va, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(pp_hw_ctx); VLC_UNUSED(pi_chroma);
++ VLC_UNUSED(i_width); VLC_UNUSED(i_height);
++ assert(0);
++ return -1;
++}
++
++int VaExtract( vlc_va_t *p_va, picture_t *p_picture, AVFrame *p_ff )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(p_picture); VLC_UNUSED(p_ff);
++ assert(0);
++ return -1;
++}
++
++int VaGrabSurface( vlc_va_t *p_va, AVFrame *p_ff )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(p_ff);
++ assert(0);
++ return -1;
++}
++
++void VaUngrabSurface( vlc_va_t *p_va, AVFrame *p_ff )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(p_ff);
++ assert(0);
++}
++
++#endif
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/vaapi.h
vlc-1.0.0-rc4-new/modules/codec/avcodec/vaapi.h
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/vaapi.h 1969-12-31
16:00:00.000000000 -0800
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/vaapi.h 2009-06-19
16:31:52.000000000 -0700
+@@ -0,0 +1,43 @@
++/*****************************************************************************
++ * vaapi.h: VAAPI helpers for the ffmpeg decoder
++
*****************************************************************************
++ * Copyright (C) 2009 Laurent Aimar
++ * $Id$
++ *
++ * Authors: Laurent Aimar
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
02110-1301, USA.
++
*****************************************************************************/
++
++#ifndef _VLC_VAAPI_H
++#define _VLC_VAAPI_H 1
++
++typedef struct vlc_va_t vlc_va_t;
++
++vlc_va_t *VaNew( int i_codec_id );
++void VaDelete( vlc_va_t *p_va );
++
++void VaVersion( vlc_va_t *p_va, char *psz_version, size_t i_version );
++
++int VaSetup( vlc_va_t *p_va, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height );
++
++int VaExtract( vlc_va_t *p_va, picture_t *p_picture, AVFrame *p_ff );
++
++int VaGrabSurface( vlc_va_t *p_va, AVFrame *p_ff );
++
++void VaUngrabSurface( vlc_va_t *p_va, AVFrame *p_ff );
++
++#endif
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/video.c
vlc-1.0.0-rc4-new/modules/codec/avcodec/video.c
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/video.c 2009-06-14
11:14:59.000000000 -0700
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/video.c 2009-06-19
16:36:25.000000000 -0700
+@@ -34,10 +34,14 @@
+ #include
+ #include /* BITMAPINFOHEADER
*/
+ #include
++#include
+
+ /* ffmpeg header */
+ #ifdef HAVE_LIBAVCODEC_AVCODEC_H
+ # include
++# ifdef HAVE_AVCODEC_VAAPI
++# include
++# endif
+ #elif defined(HAVE_FFMPEG_AVCODEC_H)
+ # include
+ #else
+@@ -45,6 +49,7 @@
+ #endif
+
+ #include "avcodec.h"
++#include "vaapi.h"
+
+
/*****************************************************************************
+ * decoder_sys_t : decoder descriptor
+@@ -85,6 +90,9 @@
+
+ /* */
+ bool b_flush;
++
++ /* VA API */
++ vlc_va_t *p_va;
+ };
+
+ /* FIXME (dummy palette for now) */
+@@ -101,6 +109,10 @@
+ static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *, AVFrame * );
+ static void ffmpeg_NextPts( decoder_t * );
+
++static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *,
++ const enum PixelFormat * );
++
++
+ static uint32_t ffmpeg_CodecTag( vlc_fourcc_t fcc )
+ {
+ uint8_t *p = (uint8_t*)&fcc;
+@@ -115,7 +127,7 @@
+ static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec,
+ AVCodecContext *p_context )
+ {
+- picture_t *p_pic;
++ decoder_sys_t *p_sys = p_dec->p_sys;
+
+ p_dec->fmt_out.video.i_width = p_context->width;
+ p_dec->fmt_out.video.i_height = p_context->height;
+@@ -125,10 +137,12 @@
+ return NULL; /* invalid display size */
+ }
+
+- if( GetVlcChroma( &p_dec->fmt_out.video, p_context->pix_fmt ) !=
VLC_SUCCESS )
++ if( !p_sys->p_va && GetVlcChroma( &p_dec->fmt_out.video,
p_context->pix_fmt ) )
+ {
+- /* we are doomed, but not really, because most codecs set their
pix_fmt much later */
+- p_dec->fmt_out.i_codec = VLC_FOURCC('I','4','2','0');
++ /* we are doomed, but not really, because most codecs set their
pix_fmt
++ * much later
++ * FIXME does it make sense here ? */
++ p_dec->fmt_out.video.i_chroma = VLC_FOURCC('I','4','2','0');
+ }
+ p_dec->fmt_out.i_codec = p_dec->fmt_out.video.i_chroma;
+
+@@ -166,9 +180,7 @@
+ p_dec->fmt_out.video.i_frame_rate_base = p_context->time_base.num;
+ }
+
+- p_pic = decoder_NewPicture( p_dec );
+-
+- return p_pic;
++ return decoder_NewPicture( p_dec );
+ }
+
+
/*****************************************************************************
+@@ -193,6 +205,7 @@
+ p_sys->psz_namecodec = psz_namecodec;
+ p_sys->p_ff_pic = avcodec_alloc_frame();
+ p_sys->b_delayed_open = true;
++ p_sys->p_va = NULL;
+
+ /* ***** Fill p_context with init values ***** */
+ p_sys->p_context->codec_tag = ffmpeg_CodecTag( p_dec->fmt_in.i_codec
);
+@@ -319,6 +332,9 @@
+ p_sys->p_context->release_buffer = ffmpeg_ReleaseFrameBuf;
+ p_sys->p_context->opaque = p_dec;
+
++ if( var_CreateGetBool( p_dec, "ffmpeg-hw" ) )
++ p_sys->p_context->get_format = ffmpeg_GetFormat;
++
+ /* ***** misc init ***** */
+ p_sys->input_pts = p_sys->input_dts = 0;
+ p_sys->i_pts = 0;
+@@ -621,7 +637,7 @@
+ p_sys->i_late_frames = 0;
+ }
+
+- if( !b_drawpicture || !p_sys->p_ff_pic->linesize[0] )
++ if( !b_drawpicture || ( !p_sys->p_va
&& !p_sys->p_ff_pic->linesize[0] ) )
+ {
+ /* Do not display the picture */
+ p_pic = (picture_t *)p_sys->p_ff_pic->opaque;
+@@ -736,6 +752,9 @@
+
+ if( p_sys->p_ff_pic ) av_free( p_sys->p_ff_pic );
+ free( p_sys->p_buffer_orig );
++
++ if( p_sys->p_va )
++ VaDelete( p_sys->p_va );
+ }
+
+
/*****************************************************************************
+@@ -838,6 +857,14 @@
+
+ p_sys->b_delayed_open = false;
+
++ if( p_sys->p_va )
++ {
++ char psz_version[128];
++
++ VaVersion( p_sys->p_va, psz_version, sizeof(psz_version) );
++ msg_Info( p_dec, "Using VA API version %s for hardware
decoding.", psz_version );
++ }
++
+ return VLC_SUCCESS;
+ }
+
/*****************************************************************************
+@@ -849,7 +876,11 @@
+ {
+ decoder_sys_t *p_sys = p_dec->p_sys;
+
+- if( TestFfmpegChroma( p_sys->p_context->pix_fmt, -1 ) == VLC_SUCCESS )
++ if( p_sys->p_va )
++ {
++ VaExtract( p_sys->p_va, p_pic, p_ff_pic );
++ }
++ else if( TestFfmpegChroma( p_sys->p_context->pix_fmt, -1 ) ==
VLC_SUCCESS )
+ {
+ int i_plane, i_size, i_line;
+ uint8_t *p_dst, *p_src;
+@@ -899,11 +930,33 @@
+ ffmpeg_SetFrameBufferPts( p_dec, p_ff_pic );
+
+ /* */
+- p_ff_pic->opaque = 0;
++ p_ff_pic->opaque = NULL;
++
++ if( p_sys->p_va )
++ {
++ if( VaSetup( p_sys->p_va,
++ &p_sys->p_context->hwaccel_context,
&p_dec->fmt_out.video.i_chroma,
++ p_sys->p_context->width, p_sys->p_context->height ) )
++ {
++ msg_Err( p_dec, "VaSetup failed" );
++ return -1;
++ }
++
++ /* */
++ p_ff_pic->type = FF_BUFFER_TYPE_USER;
++ /* FIXME what is that, should give good value */
++ p_ff_pic->age = 256*256*256*64; // FIXME FIXME from ffmpeg
+
+- /* Not much to do in indirect rendering mode */
+- if( !p_sys->b_direct_rendering )
++ if( VaGrabSurface( p_sys->p_va, p_ff_pic ) )
++ {
++ msg_Err( p_dec, "VaGrabSurface failed" );
++ return -1;
++ }
++ return 0;
++ }
++ else if( !p_sys->b_direct_rendering )
+ {
++ /* Not much to do in indirect rendering mode */
+ return avcodec_default_get_buffer( p_context, p_ff_pic );
+ }
+
+@@ -1012,20 +1065,30 @@
+ AVFrame *p_ff_pic )
+ {
+ decoder_t *p_dec = (decoder_t *)p_context->opaque;
++ decoder_sys_t *p_sys = p_dec->p_sys;
++
++ if( p_sys->p_va )
++ {
++ VaUngrabSurface( p_sys->p_va, p_ff_pic );
+
+- if( !p_ff_pic->opaque )
++ /* */
++ for( int i = 0; i < 4; i++ )
++ p_ff_pic->data = NULL;
++ }
++ else if( !p_ff_pic->opaque )
+ {
+ avcodec_default_release_buffer( p_context, p_ff_pic );
+- return;
+ }
++ else
++ {
++ picture_t *p_pic = (picture_t*)p_ff_pic->opaque;
+
+- picture_t *p_pic = (picture_t*)p_ff_pic->opaque;
+- decoder_UnlinkPicture( p_dec, p_pic );
++ decoder_UnlinkPicture( p_dec, p_pic );
+
+- p_ff_pic->data[0] = NULL;
+- p_ff_pic->data[1] = NULL;
+- p_ff_pic->data[2] = NULL;
+- p_ff_pic->data[3] = NULL;
++ /* */
++ for( int i = 0; i < 4; i++ )
++ p_ff_pic->data = NULL;
++ }
+ }
+
+ static void ffmpeg_NextPts( decoder_t *p_dec )
+@@ -1052,3 +1115,53 @@
+ (2 * p_sys->p_context->time_base.den);
+ }
+ }
++
++static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *p_codec,
++ const enum PixelFormat *pi_fmt )
++{
++ decoder_t *p_dec = p_codec->opaque;
++ decoder_sys_t *p_sys = p_dec->p_sys;
++
++ if( p_sys->p_va )
++ {
++ VaDelete( p_sys->p_va );
++ p_sys->p_va = NULL;
++ }
++
++ /* Try too look for a supported hw acceleration */
++ for( int i = 0; pi_fmt != PIX_FMT_NONE; i++ )
++ {
++ static const char *ppsz_name[PIX_FMT_NB] = {
++ [PIX_FMT_VDPAU_H264] = "PIX_FMT_VDPAU_H264",
++ [PIX_FMT_VAAPI_IDCT] = "PIX_FMT_VAAPI_IDCT",
++ [PIX_FMT_VAAPI_VLD] = "PIX_FMT_VAAPI_VLD",
++ [PIX_FMT_VAAPI_MOCO] = "PIX_FMT_VAAPI_MOCO",
++ [PIX_FMT_YUYV422] = "PIX_FMT_YUYV422",
++ [PIX_FMT_YUV420P] = "PIX_FMT_YUV420P",
++ };
++ msg_Dbg( p_dec, "Available decoder output format %d (%s)",
pi_fmt, ppsz_name[pi_fmt] ?: "Unknown" );
++
++ /* Only VLD supported */
++ if( pi_fmt == PIX_FMT_VAAPI_VLD )
++ {
++ msg_Dbg( p_dec, "Trying VA API" );
++ p_sys->p_va = VaNew( p_sys->i_codec_id );
++ if( p_sys->p_va )
++ {
++ /* FIXME this will disabled direct rendering
++ * even if a new pixel format is renegociated
++ *
++ * FIXME Try to call VaSetup when possible
++ * to detect errors when possible (later is too late) */
++ p_sys->b_direct_rendering = false;
++ p_sys->p_context->draw_horiz_band = NULL;
++ return pi_fmt;
++ }
++ msg_Warn( p_dec, "Failed to open VA API" );
++ }
++ }
++
++ /* Fallback to default behaviour */
++ return avcodec_default_get_format( p_codec, pi_fmt );
++}
++

http://www.blowdata4u.com



0 Kudos
Rajkumar
Beginner
2,924 Views
Quoting - raj.ece03
Quoting - blowdata4u
Added:

trunk/gar-minimyth/script/mediaplayers/vlc/files/vlc-1.0.0-rc4-vaapi.patch

Log:
- Added VLC VAAPI patch to the build system but did not include it in the
build.



Added:
trunk/gar-minimyth/script/mediaplayers/vlc/files/vlc-1.0.0-rc4-vaapi.patch
==============================================================================
--- (empty file)
+++
trunk/gar-minimyth/script/mediaplayers/vlc/files/vlc-1.0.0-rc4-vaapi.patch

Fri Jun 19 20:35:58 2009
@@ -0,0 +1,860 @@
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/avcodec.c
vlc-1.0.0-rc4-new/modules/codec/avcodec/avcodec.c
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/avcodec.c 2009-05-10
16:03:54.000000000 -0700
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/avcodec.c 2009-06-19
16:31:52.000000000 -0700
+@@ -129,6 +129,9 @@
+
+ add_integer( "ffmpeg-debug", 0, NULL, DEBUG_TEXT, DEBUG_LONGTEXT,
+ true )
++#ifdef HAVE_AVCODEC_VAAPI
++ add_bool( "ffmpeg-hw", true, NULL, HW_TEXT, HW_LONGTEXT, true )
++#endif
+
+ #ifdef ENABLE_SOUT
+ /* encoder submodule */
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/avcodec.h
vlc-1.0.0-rc4-new/modules/codec/avcodec/avcodec.h
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/avcodec.h 2009-05-10
16:03:54.000000000 -0700
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/avcodec.h 2009-06-19
16:31:52.000000000 -0700
+@@ -127,6 +127,9 @@
+ "usually has a detrimental effect on quality. However it provides a
big "
+ "speedup for high definition streams." )
+
++#define HW_TEXT N_("Hardware decoding")
++#define HW_LONGTEXT N_("This allows hardware decoding when available.")
++
+ /*
+ * Encoder options
+ */
+@@ -257,3 +260,6 @@
+ # define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c))
+ #endif
+
++/* Uncomment it to enable compilation with vaapi (you also must change
the build
++ * system) */
++//#define HAVE_AVCODEC_VAAPI 1
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/Modules.am
vlc-1.0.0-rc4-new/modules/codec/avcodec/Modules.am
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/Modules.am 2009-05-10
16:03:54.000000000 -0700
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/Modules.am 2009-06-19
16:31:52.000000000 -0700
+@@ -7,6 +7,7 @@
+ avutil.h
+ fourcc.c
+ chroma.c
++ vaapi.c
+ $(NULL)
+
+ if ENABLE_SOUT
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/vaapi.c
vlc-1.0.0-rc4-new/modules/codec/avcodec/vaapi.c
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/vaapi.c 1969-12-31
16:00:00.000000000 -0800
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/vaapi.c 2009-06-19
16:31:52.000000000 -0700
+@@ -0,0 +1,487 @@
++/*****************************************************************************
++ * vaapi.c: VAAPI helpers for the ffmpeg decoder
++
*****************************************************************************
++ * Copyright (C) 2009 Laurent Aimar
++ * $Id$
++ *
++ * Authors: Laurent Aimar
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
02110-1301, USA.
++
*****************************************************************************/
++
++#ifdef HAVE_CONFIG_H
++# include "config.h"
++#endif
++
++#include
++#include
++#include
++
++#ifdef HAVE_LIBAVCODEC_AVCODEC_H
++# include
++# include
++#elif defined(HAVE_FFMPEG_AVCODEC_H)
++# include
++#else
++# include
++#endif
++
++#include "avcodec.h"
++#include "vaapi.h"
++
++#ifdef HAVE_AVCODEC_VAAPI
++
++#include
++#include
++
++
++typedef struct
++{
++ VASurfaceID i_id;
++ int i_refcount;
++ unsigned int i_order;
++
++} vlc_va_surface_t;
++
++struct vlc_va_t
++{
++ /* */
++ Display *p_display_x11;
++ VADisplay p_display;
++
++ VAConfigID i_config_id;
++ VAContextID i_context_id;
++
++ struct vaapi_context hw_ctx;
++
++ /* */
++ int i_version_major;
++ int i_version_minor;
++
++ /* */
++ int i_surface_count;
++ unsigned int i_surface_order;
++ int i_surface_width;
++ int i_surface_height;
++ vlc_fourcc_t i_surface_chroma;
++
++ vlc_va_surface_t *p_surface;
++
++ VAImage image;
++
++};
++
++static int VaOpen( vlc_va_t *p_va, int i_codec_id );
++static void VaClose( vlc_va_t *p_va );
++
++static int VaCreateSurfaces( vlc_va_t *p_va, void **pp_hw_ctx,
vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height );
++static void VaDestroySurfaces( vlc_va_t *p_va );
++
++vlc_va_t *VaNew( int i_codec_id )
++{
++ vlc_va_t *p_va = calloc( 1, sizeof(*p_va) );
++ if( !p_va )
++ return NULL;
++
++ if( VaOpen( p_va, i_codec_id ) )
++ {
++ free( p_va );
++ return NULL;
++ }
++ return p_va;
++}
++void VaDelete( vlc_va_t *p_va )
++{
++ VaClose( p_va );
++ free( p_va );
++}
++int VaSetup( vlc_va_t *p_va, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height )
++{
++ if( p_va->i_surface_width == i_width &&
++ p_va->i_surface_height == i_height )
++ return VLC_SUCCESS;
++
++ *pp_hw_ctx = NULL;
++ *pi_chroma = 0;
++ if( p_va->i_surface_width || p_va->i_surface_height )
++ VaDestroySurfaces( p_va );
++
++ if( i_width > 0 && i_height > 0 )
++ return VaCreateSurfaces( p_va, pp_hw_ctx, pi_chroma, i_width,
i_height );
++
++ return VLC_EGENERIC;
++}
++void VaVersion( vlc_va_t *p_va, char *psz_version, size_t i_version )
++{
++ snprintf( psz_version, i_version, "%d.%d", p_va->i_version_major,
p_va->i_version_minor );
++}
++
++static int VaOpen( vlc_va_t *p_va, int i_codec_id )
++{
++ VAProfile i_profile;
++ int i_surface_count;
++
++ /* */
++ switch( i_codec_id )
++ {
++ case CODEC_ID_MPEG1VIDEO:
++ case CODEC_ID_MPEG2VIDEO:
++ i_profile = VAProfileMPEG2Main;
++ i_surface_count = 2+1;
++ break;
++ case CODEC_ID_MPEG4:
++ i_profile = VAProfileMPEG4AdvancedSimple;
++ i_surface_count = 2+1;
++ break;
++ case CODEC_ID_WMV3:
++ i_profile = VAProfileVC1Main;
++ i_surface_count = 2+1;
++ break;
++ case CODEC_ID_VC1:
++ i_profile = VAProfileVC1Advanced;
++ i_surface_count = 2+1;
++ break;
++ case CODEC_ID_H264:
++ i_profile = VAProfileH264High;
++ i_surface_count = 16+1;
++ break;
++ default:
++ return VLC_EGENERIC;
++ }
++
++ /* */
++ memset( p_va, 0, sizeof(*p_va) );
++
++ /* Create a VA display */
++ p_va->p_display_x11 = XOpenDisplay(NULL);
++ if( !p_va->p_display_x11 )
++ goto error;
++
++ p_va->p_display = vaGetDisplay( p_va->p_display_x11 );
++ if( !p_va->p_display )
++ goto error;
++
++ if( vaInitialize( p_va->p_display, &p_va->i_version_major,
&p_va->i_version_minor ) )
++ goto error;
++
++ /* Create a VA configuration */
++ VAConfigAttrib attrib;
++ memset( &attrib, 0, sizeof(attrib) );
++ attrib.type = VAConfigAttribRTFormat;
++ if( vaGetConfigAttributes( p_va->p_display,
++ i_profile, VAEntrypointVLD, &attrib, 1 ) )
++ goto error;
++
++ /* Not sure what to do if not, I don't have a way to test */
++ if( (attrib.value & VA_RT_FORMAT_YUV420) == 0 )
++ goto error;
++ if( vaCreateConfig( p_va->p_display,
++ i_profile, VAEntrypointVLD, &attrib, 1,
&p_va->i_config_id ) )
++ {
++ p_va->i_config_id = 0;
++ goto error;
++ }
++
++ p_va->i_surface_count = i_surface_count;
++
++ return VLC_SUCCESS;
++
++error:
++ return VLC_EGENERIC;
++}
++static void VaClose( vlc_va_t *p_va )
++{
++ if( p_va->i_surface_width || p_va->i_surface_height )
++ VaDestroySurfaces( p_va );
++
++ if( p_va->i_config_id )
++ vaDestroyConfig( p_va->p_display, p_va->i_config_id );
++ if( p_va->p_display )
++ vaTerminate( p_va->p_display );
++ if( p_va->p_display_x11 )
++ XCloseDisplay( p_va->p_display_x11 );
++}
++
++static int VaCreateSurfaces( vlc_va_t *p_va, void **pp_hw_ctx,
vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height )
++{
++ assert( i_width > 0 && i_height > 0 );
++
++ /* */
++ p_va->p_surface = calloc( p_va->i_surface_count,
sizeof(*p_va->p_surface) );
++ if( !p_va->p_surface )
++ return VLC_EGENERIC;
++
++ /* Create surfaces */
++ VASurfaceID pi_surface_id[p_va->i_surface_count];
++ if( vaCreateSurfaces( p_va->p_display, i_width, i_height,
VA_RT_FORMAT_YUV420,
++ p_va->i_surface_count, pi_surface_id ) )
++ {
++ for( int i = 0; i < p_va->i_surface_count; i++ )
++ p_va->p_surface.i_id = VA_INVALID_SURFACE;
++ goto error;
++ }
++
++ for( int i = 0; i < p_va->i_surface_count; i++ )
++ {
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ p_surface->i_id = pi_surface_id;
++ p_surface->i_refcount = 0;
++ p_surface->i_order = 0;
++ }
++
++ /* Create a context */
++ if( vaCreateContext( p_va->p_display, p_va->i_config_id,
++ i_width, i_height, VA_PROGRESSIVE,
++ pi_surface_id, p_va->i_surface_count,
&p_va->i_context_id ) )
++ {
++ p_va->i_context_id = 0;
++ goto error;
++ }
++
++ /* Find a supported image chroma */
++ int i_fmt_count = vaMaxNumImageFormats( p_va->p_display );
++ VAImageFormat *p_fmt = calloc( i_fmt_count, sizeof(*p_fmt) );
++ if( !p_fmt )
++ goto error;
++
++ if( vaQueryImageFormats( p_va->p_display, p_fmt, &i_fmt_count ) )
++ {
++ free( p_fmt );
++ goto error;
++ }
++
++ vlc_fourcc_t i_chroma = 0;
++ VAImageFormat fmt;
++ for( int i = 0; i < i_fmt_count; i++ )
++ {
++ if( p_fmt.fourcc == VA_FOURCC( 'Y', 'V', '1', '2' ) ||
++ p_fmt.fourcc == VA_FOURCC( 'I', '4', '2', '0' ) )
++ {
++ i_chroma = VLC_FOURCC( 'I', '4', '2', '0' );
++ fmt = p_fmt;
++ }
++ /* TODO: It seems that these may also be available (but not
++ * with my setup):
++ * VA_FOURCC( 'N', 'V', '1', '2')
++ * VA_FOURCC( 'U', 'Y', 'V', 'Y')
++ * VA_FOURCC( 'Y', 'U', 'Y', 'V')
++ */
++ }
++ free( p_fmt );
++ if( !i_chroma )
++ goto error;
++ *pi_chroma = i_chroma;
++
++ /* Create an image for surface extraction */
++ if( vaCreateImage( p_va->p_display, &fmt, i_width, i_height,
&p_va->image ) )
++ {
++ p_va->image.image_id = 0;
++ goto error;
++ }
++
++ /* Setup the ffmpeg hardware context */
++ *pp_hw_ctx = &p_va->hw_ctx;
++
++ memset( &p_va->hw_ctx, 0, sizeof(p_va->hw_ctx) );
++ p_va->hw_ctx.display = p_va->p_display;
++ p_va->hw_ctx.config_id = p_va->i_config_id;
++ p_va->hw_ctx.context_id = p_va->i_context_id;
++
++ /* */
++ p_va->i_surface_chroma = i_chroma;
++ p_va->i_surface_width = i_width;
++ p_va->i_surface_height = i_height;
++ return VLC_SUCCESS;
++
++error:
++ VaDestroySurfaces( p_va );
++ return VLC_EGENERIC;
++}
++static void VaDestroySurfaces( vlc_va_t *p_va )
++{
++ if( p_va->image.image_id )
++ vaDestroyImage( p_va->p_display, p_va->image.image_id );
++
++ if( p_va->i_context_id )
++ vaDestroyContext( p_va->p_display, p_va->i_context_id );
++
++ for( int i = 0; i < p_va->i_surface_count && p_va->p_surface; i++ )
++ {
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ if( p_surface->i_id != VA_INVALID_SURFACE )
++ vaDestroySurfaces( p_va->p_display, &p_surface->i_id, 1 );
++ }
++ free( p_va->p_surface );
++
++ /* */
++ p_va->image.image_id = 0;
++ p_va->i_context_id = 0;
++ p_va->p_surface = NULL;
++ p_va->i_surface_width = 0;
++ p_va->i_surface_height = 0;
++}
++
++int VaExtract( vlc_va_t *p_va, picture_t *p_picture, AVFrame *p_ff )
++{
++ VASurfaceID i_surface_id = (VASurfaceID)(uintptr_t)p_ff->data[3];
++
++ if( vaSyncSurface( p_va->p_display, p_va->i_context_id, i_surface_id
) )
++ return VLC_EGENERIC;
++
++ /* XXX vaDeriveImage may be better but it is not supported by
++ * my setup.
++ */
++
++ if( vaGetImage( p_va->p_display, i_surface_id,
++ 0, 0, p_va->i_surface_width, p_va->i_surface_height,
++ p_va->image.image_id) )
++ return VLC_EGENERIC;
++
++ void *p_base;
++ if( vaMapBuffer( p_va->p_display, p_va->image.buf, &p_base ) )
++ return VLC_EGENERIC;
++
++ for( int i_plane = 0; i_plane < p_picture->i_planes; i_plane++ )
++ {
++ const int i_src_plane = ((p_va->image.format.fourcc ==
VA_FOURCC('Y','V','1','2' )) && i_plane != 0) ? (3 - i_plane) : i_plane;
++ const uint8_t *p_src = (uint8_t*)p_base +
p_va->image.offsets[i_src_plane];
++ const int i_src_stride = p_va->image.pitches[i_src_plane];
++
++ uint8_t *p_dst = p_picture->p[i_plane].p_pixels;
++ const int i_dst_stride = p_picture->p[i_plane].i_pitch;
++
++ if( i_src_stride != i_dst_stride )
++ {
++ for( int i = 0; i < p_picture->p[i_plane].i_visible_lines;
i++ )
++ {
++ vlc_memcpy( p_dst, p_src, __MIN( i_src_stride,
i_dst_stride ) );
++ p_src += i_src_stride;
++ p_dst += i_dst_stride;
++ }
++ }
++ else
++ {
++ vlc_memcpy( p_dst, p_src,
p_picture->p[i_plane].i_visible_lines * i_src_stride );
++ }
++ }
++
++ if( vaUnmapBuffer( p_va->p_display, p_va->image.buf ) )
++ return VLC_EGENERIC;
++
++ return VLC_SUCCESS;
++}
++int VaGrabSurface( vlc_va_t *p_va, AVFrame *p_ff )
++{
++ int i_old;
++ int i;
++
++ /* Grab an unused surface, in case none are, try the oldest
++ * XXX using the oldest is a workaround in case a problem happens
with ffmpeg */
++ for( i = 0, i_old = 0; i < p_va->i_surface_count; i++ )
++ {
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ if( !p_surface->i_refcount )
++ break;
++
++ if( p_surface->i_order < p_va->p_surface[i_old].i_order )
++ i_old = i;
++ }
++ if( i >= p_va->i_surface_count )
++ i = i_old;
++
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ p_surface->i_refcount = 1;
++ p_surface->i_order = p_va->i_surface_order++;
++
++ /* */
++ for( int i = 0; i < 4; i++ )
++ {
++ p_ff->data = NULL;
++ p_ff->linesize = 0;
++
++ if( i == 0 || i == 3 )
++ p_ff->data = (void*)(uintptr_t)p_surface->i_id;/* Yummie */
++ }
++ return VLC_SUCCESS;
++}
++void VaUngrabSurface( vlc_va_t *p_va, AVFrame *p_ff )
++{
++ VASurfaceID i_surface_id = (VASurfaceID)(uintptr_t)p_ff->data[3];
++
++ for( int i = 0; i < p_va->i_surface_count; i++ )
++ {
++ vlc_va_surface_t *p_surface = &p_va->p_surface;
++
++ if( p_surface->i_id == i_surface_id )
++ p_surface->i_refcount--;
++ }
++}
++
++#else
++
++vlc_va_t *VaNew( int i_codec_id )
++{
++ VLC_UNUSED(i_codec_id);
++ return NULL;
++}
++void VaDelete( vlc_va_t *p_va )
++{
++ VLC_UNUSED(p_va);
++ assert( 0 );
++}
++
++void VaVersion( vlc_va_t *p_va, char *psz_version, size_t i_version )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(psz_version); VLC_UNUSED(i_version);
++ assert(0);
++}
++
++int VaSetup( vlc_va_t *p_va, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(pp_hw_ctx); VLC_UNUSED(pi_chroma);
++ VLC_UNUSED(i_width); VLC_UNUSED(i_height);
++ assert(0);
++ return -1;
++}
++
++int VaExtract( vlc_va_t *p_va, picture_t *p_picture, AVFrame *p_ff )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(p_picture); VLC_UNUSED(p_ff);
++ assert(0);
++ return -1;
++}
++
++int VaGrabSurface( vlc_va_t *p_va, AVFrame *p_ff )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(p_ff);
++ assert(0);
++ return -1;
++}
++
++void VaUngrabSurface( vlc_va_t *p_va, AVFrame *p_ff )
++{
++ VLC_UNUSED(p_va); VLC_UNUSED(p_ff);
++ assert(0);
++}
++
++#endif
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/vaapi.h
vlc-1.0.0-rc4-new/modules/codec/avcodec/vaapi.h
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/vaapi.h 1969-12-31
16:00:00.000000000 -0800
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/vaapi.h 2009-06-19
16:31:52.000000000 -0700
+@@ -0,0 +1,43 @@
++/*****************************************************************************
++ * vaapi.h: VAAPI helpers for the ffmpeg decoder
++
*****************************************************************************
++ * Copyright (C) 2009 Laurent Aimar
++ * $Id$
++ *
++ * Authors: Laurent Aimar
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
02110-1301, USA.
++
*****************************************************************************/
++
++#ifndef _VLC_VAAPI_H
++#define _VLC_VAAPI_H 1
++
++typedef struct vlc_va_t vlc_va_t;
++
++vlc_va_t *VaNew( int i_codec_id );
++void VaDelete( vlc_va_t *p_va );
++
++void VaVersion( vlc_va_t *p_va, char *psz_version, size_t i_version );
++
++int VaSetup( vlc_va_t *p_va, void **pp_hw_ctx, vlc_fourcc_t *pi_chroma,
++ int i_width, int i_height );
++
++int VaExtract( vlc_va_t *p_va, picture_t *p_picture, AVFrame *p_ff );
++
++int VaGrabSurface( vlc_va_t *p_va, AVFrame *p_ff );
++
++void VaUngrabSurface( vlc_va_t *p_va, AVFrame *p_ff );
++
++#endif
+diff -Naur vlc-1.0.0-rc4-old/modules/codec/avcodec/video.c
vlc-1.0.0-rc4-new/modules/codec/avcodec/video.c
+--- vlc-1.0.0-rc4-old/modules/codec/avcodec/video.c 2009-06-14
11:14:59.000000000 -0700
++++ vlc-1.0.0-rc4-new/modules/codec/avcodec/video.c 2009-06-19
16:36:25.000000000 -0700
+@@ -34,10 +34,14 @@
+ #include
+ #include /* BITMAPINFOHEADER
*/
+ #include
++#include
+
+ /* ffmpeg header */
+ #ifdef HAVE_LIBAVCODEC_AVCODEC_H
+ # include
++# ifdef HAVE_AVCODEC_VAAPI
++# include
++# endif
+ #elif defined(HAVE_FFMPEG_AVCODEC_H)
+ # include
+ #else
+@@ -45,6 +49,7 @@
+ #endif
+
+ #include "avcodec.h"
++#include "vaapi.h"
+
+
/*****************************************************************************
+ * decoder_sys_t : decoder descriptor
+@@ -85,6 +90,9 @@
+
+ /* */
+ bool b_flush;
++
++ /* VA API */
++ vlc_va_t *p_va;
+ };
+
+ /* FIXME (dummy palette for now) */
+@@ -101,6 +109,10 @@
+ static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *, AVFrame * );
+ static void ffmpeg_NextPts( decoder_t * );
+
++static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *,
++ const enum PixelFormat * );
++
++
+ static uint32_t ffmpeg_CodecTag( vlc_fourcc_t fcc )
+ {
+ uint8_t *p = (uint8_t*)&fcc;
+@@ -115,7 +127,7 @@
+ static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec,
+ AVCodecContext *p_context )
+ {
+- picture_t *p_pic;
++ decoder_sys_t *p_sys = p_dec->p_sys;
+
+ p_dec->fmt_out.video.i_width = p_context->width;
+ p_dec->fmt_out.video.i_height = p_context->height;
+@@ -125,10 +137,12 @@
+ return NULL; /* invalid display size */
+ }
+
+- if( GetVlcChroma( &p_dec->fmt_out.video, p_context->pix_fmt ) !=
VLC_SUCCESS )
++ if( !p_sys->p_va && GetVlcChroma( &p_dec->fmt_out.video,
p_context->pix_fmt ) )
+ {
+- /* we are doomed, but not really, because most codecs set their
pix_fmt much later */
+- p_dec->fmt_out.i_codec = VLC_FOURCC('I','4','2','0');
++ /* we are doomed, but not really, because most codecs set their
pix_fmt
++ * much later
++ * FIXME does it make sense here ? */
++ p_dec->fmt_out.video.i_chroma = VLC_FOURCC('I','4','2','0');
+ }
+ p_dec->fmt_out.i_codec = p_dec->fmt_out.video.i_chroma;
+
+@@ -166,9 +180,7 @@
+ p_dec->fmt_out.video.i_frame_rate_base = p_context->time_base.num;
+ }
+
+- p_pic = decoder_NewPicture( p_dec );
+-
+- return p_pic;
++ return decoder_NewPicture( p_dec );
+ }
+
+
/*****************************************************************************
+@@ -193,6 +205,7 @@
+ p_sys->psz_namecodec = psz_namecodec;
+ p_sys->p_ff_pic = avcodec_alloc_frame();
+ p_sys->b_delayed_open = true;
++ p_sys->p_va = NULL;
+
+ /* ***** Fill p_context with init values ***** */
+ p_sys->p_context->codec_tag = ffmpeg_CodecTag( p_dec->fmt_in.i_codec
);
+@@ -319,6 +332,9 @@
+ p_sys->p_context->release_buffer = ffmpeg_ReleaseFrameBuf;
+ p_sys->p_context->opaque = p_dec;
+
++ if( var_CreateGetBool( p_dec, "ffmpeg-hw" ) )
++ p_sys->p_context->get_format = ffmpeg_GetFormat;
++
+ /* ***** misc init ***** */
+ p_sys->input_pts = p_sys->input_dts = 0;
+ p_sys->i_pts = 0;
+@@ -621,7 +637,7 @@
+ p_sys->i_late_frames = 0;
+ }
+
+- if( !b_drawpicture || !p_sys->p_ff_pic->linesize[0] )
++ if( !b_drawpicture || ( !p_sys->p_va
&& !p_sys->p_ff_pic->linesize[0] ) )
+ {
+ /* Do not display the picture */
+ p_pic = (picture_t *)p_sys->p_ff_pic->opaque;
+@@ -736,6 +752,9 @@
+
+ if( p_sys->p_ff_pic ) av_free( p_sys->p_ff_pic );
+ free( p_sys->p_buffer_orig );
++
++ if( p_sys->p_va )
++ VaDelete( p_sys->p_va );
+ }
+
+
/*****************************************************************************
+@@ -838,6 +857,14 @@
+
+ p_sys->b_delayed_open = false;
+
++ if( p_sys->p_va )
++ {
++ char psz_version[128];
++
++ VaVersion( p_sys->p_va, psz_version, sizeof(psz_version) );
++ msg_Info( p_dec, "Using VA API version %s for hardware
decoding.", psz_version );
++ }
++
+ return VLC_SUCCESS;
+ }
+
/*****************************************************************************
+@@ -849,7 +876,11 @@
+ {
+ decoder_sys_t *p_sys = p_dec->p_sys;
+
+- if( TestFfmpegChroma( p_sys->p_context->pix_fmt, -1 ) == VLC_SUCCESS )
++ if( p_sys->p_va )
++ {
++ VaExtract( p_sys->p_va, p_pic, p_ff_pic );
++ }
++ else if( TestFfmpegChroma( p_sys->p_context->pix_fmt, -1 ) ==
VLC_SUCCESS )
+ {
+ int i_plane, i_size, i_line;
+ uint8_t *p_dst, *p_src;
+@@ -899,11 +930,33 @@
+ ffmpeg_SetFrameBufferPts( p_dec, p_ff_pic );
+
+ /* */
+- p_ff_pic->opaque = 0;
++ p_ff_pic->opaque = NULL;
++
++ if( p_sys->p_va )
++ {
++ if( VaSetup( p_sys->p_va,
++ &p_sys->p_context->hwaccel_context,
&p_dec->fmt_out.video.i_chroma,
++ p_sys->p_context->width, p_sys->p_context->height ) )
++ {
++ msg_Err( p_dec, "VaSetup failed" );
++ return -1;
++ }
++
++ /* */
++ p_ff_pic->type = FF_BUFFER_TYPE_USER;
++ /* FIXME what is that, should give good value */
++ p_ff_pic->age = 256*256*256*64; // FIXME FIXME from ffmpeg
+
+- /* Not much to do in indirect rendering mode */
+- if( !p_sys->b_direct_rendering )
++ if( VaGrabSurface( p_sys->p_va, p_ff_pic ) )
++ {
++ msg_Err( p_dec, "VaGrabSurface failed" );
++ return -1;
++ }
++ return 0;
++ }
++ else if( !p_sys->b_direct_rendering )
+ {
++ /* Not much to do in indirect rendering mode */
+ return avcodec_default_get_buffer( p_context, p_ff_pic );
+ }
+
+@@ -1012,20 +1065,30 @@
+ AVFrame *p_ff_pic )
+ {
+ decoder_t *p_dec = (decoder_t *)p_context->opaque;
++ decoder_sys_t *p_sys = p_dec->p_sys;
++
++ if( p_sys->p_va )
++ {
++ VaUngrabSurface( p_sys->p_va, p_ff_pic );
+
+- if( !p_ff_pic->opaque )
++ /* */
++ for( int i = 0; i < 4; i++ )
++ p_ff_pic->data = NULL;
++ }
++ else if( !p_ff_pic->opaque )
+ {
+ avcodec_default_release_buffer( p_context, p_ff_pic );
+- return;
+ }
++ else
++ {
++ picture_t *p_pic = (picture_t*)p_ff_pic->opaque;
+
+- picture_t *p_pic = (picture_t*)p_ff_pic->opaque;
+- decoder_UnlinkPicture( p_dec, p_pic );
++ decoder_UnlinkPicture( p_dec, p_pic );
+
+- p_ff_pic->data[0] = NULL;
+- p_ff_pic->data[1] = NULL;
+- p_ff_pic->data[2] = NULL;
+- p_ff_pic->data[3] = NULL;
++ /* */
++ for( int i = 0; i < 4; i++ )
++ p_ff_pic->data = NULL;
++ }
+ }
+
+ static void ffmpeg_NextPts( decoder_t *p_dec )
+@@ -1052,3 +1115,53 @@
+ (2 * p_sys->p_context->time_base.den);
+ }
+ }
++
++static enum PixelFormat ffmpeg_GetFormat( AVCodecContext *p_codec,
++ const enum PixelFormat *pi_fmt )
++{
++ decoder_t *p_dec = p_codec->opaque;
++ decoder_sys_t *p_sys = p_dec->p_sys;
++
++ if( p_sys->p_va )
++ {
++ VaDelete( p_sys->p_va );
++ p_sys->p_va = NULL;
++ }
++
++ /* Try too look for a supported hw acceleration */
++ for( int i = 0; pi_fmt != PIX_FMT_NONE; i++ )
++ {
++ static const char *ppsz_name[PIX_FMT_NB] = {
++ [PIX_FMT_VDPAU_H264] = "PIX_FMT_VDPAU_H264",
++ [PIX_FMT_VAAPI_IDCT] = "PIX_FMT_VAAPI_IDCT",
++ [PIX_FMT_VAAPI_VLD] = "PIX_FMT_VAAPI_VLD",
++ [PIX_FMT_VAAPI_MOCO] = "PIX_FMT_VAAPI_MOCO",
++ [PIX_FMT_YUYV422] = "PIX_FMT_YUYV422",
++ [PIX_FMT_YUV420P] = "PIX_FMT_YUV420P",
++ };
++ msg_Dbg( p_dec, "Available decoder output format %d (%s)",
pi_fmt, ppsz_name[pi_fmt] ?: "Unknown" );
++
++ /* Only VLD supported */
++ if( pi_fmt == PIX_FMT_VAAPI_VLD )
++ {
++ msg_Dbg( p_dec, "Trying VA API" );
++ p_sys->p_va = VaNew( p_sys->i_codec_id );
++ if( p_sys->p_va )
++ {
++ /* FIXME this will disabled direct rendering
++ * even if a new pixel format is renegociated
++ *
++ * FIXME Try to call VaSetup when possible
++ * to detect errors when possible (later is too late) */
++ p_sys->b_direct_rendering = false;
++ p_sys->p_context->draw_horiz_band = NULL;
++ return pi_fmt;
++ }
++ msg_Warn( p_dec, "Failed to open VA API" );
++ }
++ }
++
++ /* Fallback to default behaviour */
++ return avcodec_default_get_format( p_codec, pi_fmt );
++}
++

http://www.blowdata4u.com

Hi Thanq for your reply

but i am trying with MPlayer not with vlc.



0 Kudos
duzyatko2yahoo_com
2,924 Views
Thanks for the good opportunity to learn from you posts.
regards
online essay service
0 Kudos
cobby034
Beginner
2,924 Views

3GMobile SMS + Contacts Backup is an app used to backup sms and outlook contacts on windows mobile. You could use this software to save your mobile outlook contacts and sms as .xml or txt file;Restore sms and outlook contacts from pc to mobile phone;Manage sms & outlook contacts on pc.

With 3GMobile SMS + Contacts Backup, you can:

Backup SMS Messages for windows mobile into txt file or .xml backup file and save onto your computer

Restore SMS Messages from a .xml backup file

Support all SMS default folders (Inbox, Outbox, Drafts, Sent Items, Deleted Items) and custom folders.

Export your outlook contacts into txt file or .xml backup file format and save onto your pc

Edit outlook contacts info on computer directly

Restore outlook contacts from the .xml backup file

Support unlimited outlook contacts and SMS backup/restore.

Fast backup and restore speed

Fully Support Windows Mobile 5/6.0/6.1/6.5

Easy to use

https://www.3gmobiletool.com/

0 Kudos
hope2010s
Beginner
2,924 Views

Have you ever been confused about how to convert or rip Blu-ray dvd movies to HD (High Definition) videos such as HD WMV, HD MOV, HD AVI, HD H.264/MPEG-4 AVC, MPEG-2 TS HD Video, etc.? Here we'd like to introduce you a powerful and easy-to use Blu-ray to HD Video Converter software - BestHD Blu-Ray To HD Video which can help you rip and convert Blu-ray movies to all popular HD and SD videos with high video and audio quality.

During using course, I think there are many profits to be praised! The followings are some ranks I list!

Convert Blu-ray and general DVD movie to more HD Video formats, as HD AVI, HD MPEG-4, HD MPEG-4 AVCHD MOV, HD MPEG-2 TS, HD MPEG2, HD WMV.
Set begin and end time to convert any part you like
Convert with higher definition and conversion speed.
Preview your movies.
Select windows mode you like after conversion from output settings.
Capture beautiful pictures from your movie to enrich your collection.

More info you can visit: http://www.besthdsoft.com

More Blu-ray Ripper software reviews: http://blurayripper.blogspot.com/

More Related Products : * Blu-ray* * Blu-ray To HD Video * Blu-ray Converter * Blu-ray To AVI *

0 Kudos
hope2010s
Beginner
2,924 Views

I have always wanted an iPod classic, but the price was really scary. I dont think I can afford that in the recent 3 months. So the only thing I did was taking my boyfriend to the iPod store "by Accident", then I almost looked at that iPod for 2 minutes, I guess he got my intention, so the next thing I did was waiting. I have to say that I am not proud of that, but I dont do that a lot, I only do it when I really like something and the price is way too high for me. All I need to do is going to the store with my BF accidently and staring at the thing I want, then, I know it will just show up when we have dinner or watching movie at home. It works all the time. So I was not surprised that the iPod I wanted for so long was lying in my Christmas socks. I like so much, and its capacity is like 160Gega Bytes. I can put all the things I like watching and listening in it. But I have to say I am really not good at electronic products, I copied all the things I like from my blue ray DVD to my iPod, but it didn't work, I couldn't play them. That really drove me crazy, I have to ask help from my boyfriend. Since he was working when I called him, he didn't answer, instead, he sent me a website address:http://www.besthdsoft.com.

I checked it, surprisingly, I found something is just designed for converting blu-ray to iPod. I was really excited about that, plus they were having 15% off discount at that time. What I also like about that BestHDsoft website was that the instruction was really useful for someone like me who knows nothing about electronic products, they even have images guiding people how to do it step by step. After I read those detail instructions, I decided to get one for myself. Now I am
always busy with watching the latest movies and listening to my favorite music, I guess my boyfriend is actually getting jealous because I spend so much time with my
iPod.

More info you can visit: http://www.besthdsoft.com

More Blu-ray Ripper software reviews: http://blurayripper.blogspot.com/

More Related Products :Blu-Ray Ripper, Blu-Ray To AVI, Blu-Ray To iPod, Blu-Ray To MP3, Blu-Ray To MP4, Blu-Ray To MPEG, Blu-Ray To PS3, Blu-Ray To WMV, Blu-Ray To HD Video.

0 Kudos
hope2010s
Beginner
2,673 Views

Blu-ray has a number of advantages that other video formats do not have, such as high-definition, large-capacity, etc, but the market and consumer can not accept it truly for its high price. Perhaps only some consumers that like to try new things and rich people will buy it. Most people would choose HD-DVD or ordinary DVD. However, if we still want to see Blu-ray movies, what can we do?

However, it is no longer had to worry about this issue now. We find the Blu-Ray*. Blu Ray Ripper is developed and applied to the market firstly by BestHDsoft. It develops this powerful but easy-to-use Blu Ray Ripping based solid technical. This Blu-Ray Ripper software can Rip Blu-ray and general dvd of two kinds offile formats, and it satisfy everyone's demands fully. So we dont need to purchase Blu-ray player after buying a Blu-ray Disc, and we enjoy high-definition Blu-ray movies as well. We can rip Blu-ray movies to other any video and audio formats we want with it, so that we can enjoy the Blu-ray movies at any time give us pleasure.

Compared with the functional power, the operation of this Blu Ray* is very easy for everyone. Whatever you contacted with video converter or not previously, you can quickly master it at all.

Having said that, Is this product really good? Its your decision. So hurry to try it! I believe that it will not let you down!

More info you can visit: http://www.besthdsoft.com

More Blu-ray Ripper software reviews: http://blurayripper.blogspot.com/

More Related Products :Blu-Ray Ripper, Blu-Ray To AVI, Blu-Ray To iPod, Blu-Ray To MP3, Blu-Ray To MP4, Blu-Ray To MPEG, Blu-Ray To PS3, Blu-Ray To WMV, Blu-Ray To HD Video, Blu-ray Converter, Blu-ray DVD Converter.

0 Kudos
Reply