hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <xf86drm.h>
#include <xf86drmMode.h>
#include <libdrm/drm_fourcc.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <errno.h>
#include <string.h> 
#include <stdint.h>
 
#include "pv_jpegdec_api.h"
#include "jpeg_global.h"
#include "vpu.h"
#include "vpu_api.h"
 
int getFileSize(FILE* fp)
{
    int filesize = 0;
    if(fp == NULL)
    {
        printf("fopen jpgFile fail:");
        return 0;
    }
    fseek(fp, 0, SEEK_END);
    filesize = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    return filesize;
}
 
int main(int argc, char** argv){
   char* mPath = argv[1];
   int srcSize = 0;    
   void* srcData=NULL;
   void* mDecoder;
 
    printf("jpeg_demo: mPath = %s \n", mPath);
   FILE* fp = fopen(mPath, "rb");
 
   if (fp) {
       srcSize = getFileSize(fp);
       srcData = (void*)malloc(srcSize);
       fread(srcData,1,srcSize,fp);
       fclose(fp);
   }
 
    printf("srcData=%p srcSize=%d \n", srcData, srcSize);
#ifdef DRM_LINUX
   if (srcData) {
       int aOutputLength=0;
        int ret;
       JPEG_FRAME mFrame;
 
       mDecoder = get_class_RkJpegDecoder();
        ret = init_class_RkJpegDecoder(mDecoder);
        printf("get_class_RkJpegDecoder: =%p \n", mDecoder);
       ret = dec_oneframe_class_RkJpegDecoder(mDecoder, (void*)&mFrame, &aOutputLength, srcData, &srcSize);
        printf("jpeg_demo: mFrame.jpegmem.vir_addr=0x%x addr=%p mFrame.jpegmem.phy_addr=0x%x size=%d\n",
                mFrame.jpegmem.vir_addr, mFrame.jpegmem.vir_addr,
                mFrame.jpegmem.phy_addr, mFrame.jpegmem.size);
       if (mFrame.jpegmem.vir_addr != NULL) {
           FILE* outPut = fopen("/data/output.yuv", "wb");
            printf("jpeg_demo: fwrite result ret=%s\n", strerror(errno));
           if (outPut) {
                printf("fwrite ************************** mFrame.jpegmem.size =%d\n", mFrame.jpegmem.size);
               fwrite(mFrame.jpegmem.vir_addr, mFrame.jpegmem.size, 1, outPut);
               fclose(outPut);
               outPut = NULL;
           }
       }
   }
#else
    if (srcData) {
        int aOutputLength=0;
        int ret;
        VPU_FRAME mFrame;
 
        mDecoder = get_class_RkJpegDecoder();
        ret = init_class_RkJpegDecoder(mDecoder);
        printf("get_class_RkJpegDecoder: =%p \n", mDecoder);
        ret = dec_oneframe_class_RkJpegDecoder(mDecoder, (void*)&mFrame, &aOutputLength, srcData, &srcSize);
        printf("jpeg_demo: mFrame.jpegmem.vir_addr=0x%x addr=%p mFrame.jpegmem.phy_addr=0x%x size=%d\n",
                mFrame.vpumem.vir_addr, mFrame.vpumem.vir_addr,
                mFrame.vpumem.phy_addr, mFrame.vpumem.size);
        if (mFrame.vpumem.vir_addr != NULL) {
            FILE* outPut = fopen("/data/output.yuv", "wb");
            printf("jpeg_demo: fwrite result ret=%s\n", strerror(errno));
            if (outPut) {
                printf("fwrite ************************** mFrame.jpegmem.size =%d\n", mFrame.vpumem.size);
                fwrite(mFrame.vpumem.vir_addr, mFrame.vpumem.size, 1, outPut);
                fclose(outPut);
                outPut = NULL;
            }
        }
        if (mFrame.vpumem.vir_addr != NULL)
            VPUFreeLinear(&mFrame.vpumem);
    }
#endif
   if (srcData)
       free(srcData);
   srcData = NULL;
   deinit_class_RkJpegDecoder(mDecoder);
   return 0;
}