فهرست منبع

[rga]: add rotate mode

add rotate mode for displaying image.

Signed-off-by: sliver.chen <sliver.chen@rock-chips.com>
sliver.chen 7 سال پیش
والد
کامیت
8f37d4c64f
3فایلهای تغییر یافته به همراه44 افزوده شده و 19 حذف شده
  1. 19 11
      CMakeLists.txt
  2. 23 8
      mpp/Codec.h
  3. 2 0
      rkrga/RGA.h

+ 19 - 11
CMakeLists.txt

@@ -82,6 +82,8 @@ int Codec::init(const char *file_input,
     mDisPlay = display;
     srcW = src_w;
     srcH = src_h;
+    dstW = src_w;
+    dstH = src_h;
 
     mFin = fopen(file_input, "rb");
     if (!mFin) {
@@ -126,14 +128,14 @@ int Codec::init(const char *file_input,
         cxx_log("failed to exec mpp_init.\n");
         return -7;
     }
-#if 0
+
     mRGA = new RGA();
-    ret = mRGA->init(srcW, srcH, dstW, dstH);
+    ret = mRGA->init(srcW, srcH, srcW, srcH);
     if (ret < 0) {
         cxx_log("failed to exec mRGA->init %d.\n", ret);
         return -8;
     }
-#endif
+
     mDev = create_sp_dev();
     if (!mDev) {
         cxx_log("failed to exec create_sp_dev.\n");
@@ -358,14 +360,20 @@ int Codec::decode_one_pkt(char *buf, int size, MppFrame *srcFrm, MppFrame *dstFr
                     } else {
                         cxx_log("decode_get_frame ID:%d get srcFrm %d.\n", mID, mFrmCnt++);
                         if (mDisPlay) {
-                            drm_show_frmae(*srcFrm);
-                            if (mFout) {
-                                /*
-                                 * note that write file will leads to IO block
-                                 * so if you want to test frame rate,don't wirte
-                                 * it.
-                                 */
-                                //dump_mpp_frame_to_file(*srcFrm, mFout);
+                            ret = mRGA->swscale(mpp_buffer_get_fd(mpp_frame_get_buffer(*srcFrm)),
+                                                mpp_buffer_get_fd(mpp_frame_get_buffer(*dstFrm)));
+                            if (ret < 0) {
+                                cxx_log("failed to exec mRGA->swscale ret:%d.\n", ret);
+                            } else {
+                                drm_show_frmae(*dstFrm);
+                                if (mFout) {
+                                    /*
+                                     * note that write file will leads to IO block
+                                     * so if you want to test frame rate,don't wirte
+                                     * it.
+                                     */
+                                    //dump_mpp_frame_to_file(*srcFrm, mFout);
+                                }
                             }
                         }
                     }

+ 23 - 8
mpp/Codec.h

@@ -73,11 +73,7 @@ int RGA::set_dst_fmt() {
     fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
     fmt.fmt.pix.width  = RGA_ALIGN(mDstW, 16);
     fmt.fmt.pix.height = RGA_ALIGN(mDstH, 16);
-#ifdef USE_SDL
-    fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
-#else
     fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_NV12;
-#endif
     fmt.fmt.pix.field = V4L2_FIELD_ANY;
 
     ret = ioctl(mFd, VIDIOC_S_FMT, &fmt);
@@ -185,6 +181,20 @@ int RGA::dst_buf_map() {
     return 0;
 }
 
+int RGA::set_img_rotation(unsigned degree) {
+    struct v4l2_control ctrl = {0};
+    int ret = 0;
+
+    ctrl.id = V4L2_CID_ROTATE;
+    ctrl.value = degree;
+    ret = ioctl(mFd, VIDIOC_S_CTRL, &ctrl);
+    if (ret != 0) {
+        rga_log("failed to ioctl VIDIOC_S_CTRL.\n");
+        return -1;
+    }
+    return 0;
+}
+
 int RGA::init(int srcW, int srcH, int dstW, int dstH) {
     int ret = 0;
 
@@ -217,23 +227,28 @@ int RGA::init(int srcW, int srcH, int dstW, int dstH) {
         return -4;
     }
 
+    ret = set_img_rotation(90);
+    if (ret < 0) {
+        rga_log("failed to exec set_img_rotation %d.\n", ret);
+        return -5;
+    }
+
     ret = src_buf_map();
     if (ret < 0) {
         rga_log("failed to exec src_buf_map %d.\n", ret);
-        return -5;
+        return -6;
     }
 
     ret = dst_buf_map();
     if (ret < 0) {
         rga_log("failed to exec dst_buf_map %d.\n", ret);
-        return -6;
+        return -7;
     }
 
-
     ret = open_dev_strm();
     if (ret < 0) {
         rga_log("failed to exec open_dev_strm %d.\n", ret);
-        return -7;
+        return -8;
     }
 
     return 0;

+ 2 - 0
rkrga/RGA.h

@@ -11,6 +11,7 @@ extern "C" {
 #include <fcntl.h>
 #include <errno.h>
 #include <stdio.h>
+#include <stdint.h>
 #include <string.h>
 #include <sys/ioctl.h>
 #include <linux/videodev2.h>
@@ -31,6 +32,7 @@ private:
     int open_dev_strm();
     int dst_buf_map();
     int src_buf_map();
+    int set_img_rotation(unsigned degree);
 
     int mFd;
     int mSrcW;