Hi All,

I am new to this mailing list. My problem is to rotate a frame by 90, 180 and 
270 degrees by adding/changing in FFMPEG code. For 180 degree rotation, I got 
the vf_vflip.c file under the libavfilter folder, which does the flipping, that 
means 180 degree rotation. But for 90 and 270 degree rotation we need to add in 
the ffmpeg code base.
For this purpose, I thought that vf_vflip.c would be the starting point to 
proceed. And I got that, the fliping part is done inside the start_frame() 
function of the vf_Vflip.c (am I wrong...?).

static void start_frame(AVFilterLink *link, AVFilterPicRef *picref)
{
    FlipContext *flip = link->dst->priv;
    AVFilterPicRef *ref2 = avfilter_ref_pic(picref, ~0);
    int i;

    ref2->data[0] += (ref2->h-1) * ref2->linesize[0];
    ref2->linesize[0] = -ref2->linesize[0];
    for(i = 1; i < 4; i ++) {
        if(ref2->data[i]) {
            ref2->data[i] += ((ref2->h >> flip->vsub)-1) * ref2->linesize[i];
            ref2->linesize[i] = -ref2->linesize[i];
        }
    }

    avfilter_start_frame(link->dst->outputs[0], ref2);
}

In the above code width becomes the negative of of the existing width, but 
what's the use of the two lines below ...

if(ref2->data[i]) {
            ref2->data[i] += ((ref2->h >> flip->vsub)-1) * ref2->linesize[i];
            ref2->linesize[i] = -ref2->linesize[i];
        }

This algorithm is not clear to me.

So my understanding for implementing rotation, is to add code in the 
start_frame() function. I need to rotate the frame in Y,U and V plane 
separately. But I saw that linesize[1] and linesize[2] does not represent the 
width of the frame exactly and I am confused about the exact rotation 
algorithm. For rotation in the Y plane, according to my understanding the 
rotation algorithm will be as follows ---

void rotatePicture(AVFrame *fPicture, int w, int h, AVCodecContext *enc){
  int i = 0, index, ai = 0, wi, hi ;
  uint8_t *arr = av_malloc(w*h * sizeof(uint8_t));
  uint8_t *arr1 = NULL;
  uint8_t *arr2 = NULL;
  memset(arr, 0, w*h*sizeof(uint8_t));
 
  // this is ONLY for the Y component
  for(wi = 0; wi <= w-1; wi++){
    for(hi = h - 1; hi >= 0; hi--){
      //arr[ai++] = fPicture->data[0][hi*w + wi];
      arr[ai++] = 0;
    }
  }

What do you think - is it correct... ? And then what will be for U and V 
plane...? 

Please suggest...

Thanks in Advance...

Thanks and Regards
Tilak




*--
tilak
_______________________________________________
FFmpeg-soc mailing list
[email protected]
http://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-soc

Reply via email to