[FFmpeg-devel] [PATCH] libi264: Add Hardware Accelerated H.264 Encoder based on libVA

compn tempn at mi.rr.com
Fri Jan 1 02:11:32 CET 2016


On Thu, 31 Dec 2015 22:07:56 +0100
Michael Niedermayer <michael at niedermayer.cc> wrote:

> On Thu, Dec 31, 2015 at 10:35:47PM +0500, hamza at mayartech.com wrote:
> > From: Bryan Christ <bryan.christ at mediafire.com>
> >    --enable-libx264         enable H.264 encoding via x264 [no]
> > +  --enable-libi264         enable H.264 encoding via Intel's libva

is there a difference between intel libva and other libva ? otherwise
can it just be "via libva" ?

> [...]
> > +    for (row = 0; row < frame->height/2; row++) {
> > +        unsigned char *U_row = U_start + row * U_pitch;
> > +        unsigned char *u_ptr = NULL, *v_ptr=NULL;
> > +//      int j;
> > +        int j, N, Nmod;
> > +        switch (surface_image.format.fourcc) {
> > +        case VA_FOURCC_NV12:
> > +            u_ptr = frame->data[1] + row * frame->linesize[1];
> > +            v_ptr = frame->data[2] + row * frame->linesize[2];
> > +
> > +
> > +                        Nmod = (frame->width/2) & 7; // mod 8
> > +                        N    = (frame->width/2) - Nmod;
> > +                        __asm__(
> > +                                "movq      %0,      %%rax  \n\t"
> > +                                "movq      %1,      %%rbx  \n\t"
> > +                                "movq      %2,      %%rcx  \n\t"
> > +                                "movq      %3,      %%rdx  \n\t"
> > +                                "asm_loop:                 \n\t"
> > +                                "movq      (%%rax), %%xmm0 \n\t"
> > +                                "movq      (%%rbx), %%xmm1 \n\t"
> > +                                "punpcklbw %%xmm1,  %%xmm0 \n\t"
> > +                                "movdqu    %%xmm0,  (%%rcx)\n\t"
> > +                                "addq      $0x8,    %%rax  \n\t"
> > +                                "addq      $0x8,    %%rbx  \n\t"
> > +                                "addq      $0x10,   %%rcx  \n\t"
> > +                                "cmp       %%rcx,   %%rdx  \n\t"
> > +                                "jnz       asm_loop"
> > +                                :
> > +                                : "r"(u_ptr), "r"(v_ptr),
> > "r"(U_row),
> > +                                  "r" (U_row+2*N)
> > +                                : "rax", "rbx", "rcx", "rdx",
> > "xmm0", "xmm1"
> > +                        );
> 
> x86* asm belongs in yasm files
> colorspace convertion belongs to vf_scale / swscale, why is this
> code here ?

if i may guess, colorspace conversion within this lib is so that an
external application can call lavc's i264 encoder without converting
nv12 itself.


> also FFmpeg supports many platforms, not just x86 based ones
> asm should be behind appropriate ARCH_* & cpuflags checks

yes but i think this patch is for specifically x86 intel libva

although right now i'm guessing there is also x64 intel libva?

rephrased, this is a feature just for x86 libva h264 encoding on intel
chipsets. 

would that be ok to commit as-is? and then add support for
other platforms later? i ask because sometimes it is monumental task to
support all platforms at once, especially by new contributors.

i could be wrong.

-compn


More information about the ffmpeg-devel mailing list