ffmpeg YUV420P视频帧旋转

14 篇文章 0 订阅
10 篇文章 0 订阅
//逆时针旋转90 度
-(void)frame_rotate_90WithSorrce:(AVFrame *)src des:(AVFrame*)des
{
    int n = 0;
    int hw = src->width>>1;
    int hh = src->height>>1;
    int size = src->width * src->height;
    int hsize = size>>2;

    int pos = 0;
    //copy y
    for(int j = 0; j < src->width;j++)
    {
        pos = size;
        for(int i = src->height - 1; i >= 0; i--)
        {   pos-=src->width;
            des->data[0][n++] = src->data[0][pos + j];
        }
    }
    //copy uv
    n = 0;
    for(int j = 0;j < hw;j++)
    {   pos= hsize;
        for(int i = hh - 1;i >= 0;i--)
        {
            pos-=hw;
            des->data[1][n] = src->data[1][ pos + j];
            des->data[2][n] = src->data[2][ pos + j];
            n++;
        }
    }

    des->linesize[0] = src->height;
    des->linesize[1] = src->height>>1;
    des->linesize[2] = src->height>>1;
    des->height = src->width;
    des->width = src->height;
}
//逆时针旋转180度
-(void)frame_rotate_180WithSorrce:(AVFrame *)src des:(AVFrame*)des{
    int n = 0,i= 0,j = 0;
    int hw = src->width>>1;
    int hh = src->height>>1;
    int pos= src->width * src->height;

    for (i = 0; i < src->height; i++)
    {
        pos-= src->width;
        for (int j = 0; j < src->width; j++) {
            des->data[0][n++] = src->data[0][pos + j];
        }
    }

    n = 0;
    pos = src->width * src->height>>2;

    for (i = 0; i < hh;i++) {
        pos-= hw;
        for (int j = 0; j < hw;j++) {

            des->data[1][n] = src->data[1][ pos + j];
            des->data[2][n] = src->data[2][ pos + j];
            n++;
        }
    }

    des->linesize[0] = src->width;
    des->linesize[1] = src->width>>1;
    des->linesize[2] = src->width>>1;

    des->width = src->width;
    des->height = src->height;
    des->format = src->format;

    des->pts = src->pts;
    des->pkt_pts = src->pkt_pts;
    des->pkt_dts = src->pkt_dts;

    des->key_frame = src->key_frame;
}
//逆时针旋转270度
-(void)frame_rotate_270WithSorrce:(AVFrame *)src des:(AVFrame*)des{
    int n = 0,i= 0,j = 0;
    int hw = src->width>>1;
    int hh = src->height>>1;
    int pos = 0;

    for(i = src->width-1;i >= 0;i--)
    {
        pos = 0;
        for(j= 0;j < src->height;j++)
        {
            des->data[0][n++]= src->data[0][pos+i];
            pos += src->width;
        }
    }

    n = 0;
    for (i = hw-1; i >= 0;i--) {
        pos= 0;
        for (j = 0; j < hh;j++) {
            des->data[1][n]= src->data[1][pos+i];
            des->data[2][n]= src->data[2][pos+i];
            pos += hw;
            n++;
        }
    }

    des->linesize[0] = src->height;
    des->linesize[1] = src->height>>1;
    des->linesize[2] = src->height>>1;

    des->width = src->height;
    des->height = src->width;
    des->format = src->format;

    des->pts = src->pts;
    des->pkt_pts = src->pkt_pts;
    des->pkt_dts = src->pkt_dts;

    des->key_frame = src->key_frame;
}

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值