Firefly开源社区

打印 上一主题 下一主题

我使用USB摄像头采集信号,通过RK3288硬解码,显示出来的图像是黑白的

146

积分

0

威望

0

贡献

技术小白

积分
146

我使用USB摄像头采集信号,通过RK3288硬解码,显示出来的图像是黑白的

发表于 2016-1-26 15:32:07      浏览:5727 | 回复:2        打印      只看该作者   [复制链接] 楼主
有人碰到过这各现象吗?
回复

使用道具 举报

19

积分

0

威望

0

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
19
发表于 2016-1-26 16:15:00        只看该作者  沙发
使用的参数提供一下,应该是输出的颜色格式错了。
回复

使用道具 举报

146

积分

0

威望

0

贡献

技术小白

积分
146
发表于 2016-1-26 16:35:20        只看该作者  板凳

static struct VpuCodecContext* ctx = NULL;
static RK_S32 fileSize =0, pkt_size =0;
static RK_S32 ret = 0, frame_count = 0;
static DecoderOut_t decOut;
static VideoPacket_t demoPkt;
static VideoPacket_t* pkt =NULL;
static DecoderOut_t pOut = NULL;
static VPU_FRAME *frame = NULL;
static RK_S64 fakeTimeUs =0;
static RK_U8 pExtra = NULL;
static RK_U32 extraSize = 0;
static void ExitVpu();
static void InitVpu();

int main() {
//初始化
InitVpu();

//喂数据
       processimage() //发出来现解码是黑白
       .......
//退出
       ExitVpu();
}
static void processimage (const void *p,int size) {
VPU_FRAME *frame;
RK_U32 wAlign16;
RK_U32 hAlign16;
RK_U32 frameSize;
//char name256;
char s128;

if( ( pkt  NULL ) || ( pOut  NULL ) || ( ctx == NULL ) || (REAL_RATE_DENOMINATOR<=0) )
    {
                LogInfo("vpu error");
                return;
        }
pkt->data = (RK_U8*)p;  
        pkt->capability = size;
    pkt->size = size;  
    pkt->pts = fakeTimeUs;
    fakeTimeUs += 1000000/REAL_RATE_DENOMINATOR;
pOut->size = 0;  
{
            //LogInfo("000000000000000000");
    }
if ( ctx->decode(ctx, pkt, pOut) !=0 )
{  
             LogInfo("DECODE_ERR_RET(ERROR_VPU_DECODE");
                return;
      }
if ((pOut->size) && (pOut->data))
{            
        frame = (VPU_FRAME *)(pOut->data);
VPUMemLink((VPUMemLinear_t *)&(frame->vpumem));
wAlign16 = ((frame->DisplayWidth+ 15) & (~15));  
        hAlign16 = ((frame->DisplayHeight + 15) & (~15));  
        frameSize = wAlign16*hAlign16*3/2;
sprintf(s,"%d,%d,%d,%d  %d",wAlign16,hAlign16,INIT_IMG_WIDTH,INIT_IMG_HEIGHT,frame->vpumem.size);
                LogInfo(s);
pthread_mutex_lock(&(Lock));
                REAL_WIDTH = wAlign16;
                REAL_HEIGHT = hAlign16;   
                memcpy(ybuf,frame->vpumem.vir_addr,frameSize);
                sem_post(&(updatesignal));
                pthread_mutex_unlock(&(Lock));
/*   
                FILE *fout=NULL;
                sprintf(name,"/sdcard/%dx%d.jpg",REAL_WIDTH,REAL_HEIGHT);
                if(fout==NULL) fout = fopen(name, "w");
              if(fout)fwrite(p,size, 1, fout);
              if(fout)fclose(fout);   
        */
VPUFreeLinear(&(frame->vpumem));
pOut->size = 0;  
    }
    else
}

static void InitVpu(int iextraSize) {
memset(&demoPkt, 0, sizeof(VideoPacket_t));
pkt = &demoPkt;
pkt->data = NULL;
pkt->pts = VPU_API_NOPTS_VALUE;
pkt->dts = VPU_API_NOPTS_VALUE;

memset(&decOut, 0, sizeof(DecoderOut_t));  
    pOut = &decOut;  
    pOut->data = (RK_U8*)(malloc)(sizeof(VPU_FRAME));  
    if (pOut->data ==NULL) {  
        LogInfo("DECODE_ERR_RET(ERROR_MEMORY)");  
        return;
    }  
    memset(pOut->data, 0, sizeof(VPU_FRAME));  
ret = vpu_open_context(&ctx);  
    if (ret || (ctx ==NULL)) {  
        LogInfo("DECODE_ERR_RET(ERROR_MEMORY)");  
        return;
    }   
extraSize = sizeof(int) * (REAL_WIDTH*REAL_HEIGHT);
         pExtra = (RK_U8*)rgb;  
    if (pExtra ==NULL) {  
        LogInfo("DECODE_ERR_RET(ERROR_MEMORY)");  
        return;
    }  
    memset(pExtra, 0, extraSize);
ctx->codecType   = CODEC_DECODER;  
    ctx->videoCoding = OMX_ON2_VIDEO_CodingMJPEG;  
    ctx->width       = REAL_WIDTH;  
    ctx->height      = REAL_HEIGHT;  
    ctx->no_thread   = 1;
    //ctx->enableparsing = 1;
if ((ret = ctx->init(ctx, pExtra, extraSize)) !=0) {   
       LogInfo("DECODE_ERR_RET(ERROR_INIT_VPU)");
       ExitVpu();
       return;  
    }        
/*
        vpu_api_init(&mVpu_api, OMX_ON2_VIDEO_CodingMJPEG);
        decHandle = mVpu_api.get_class_On2Decoder();
        mVpu_api.init_class_On2Decoder(decHandle);
        */
}
static void ExitVpu() {
if (ctx) {
vpu_close_context(&ctx);
ctx = NULL;
}

if (pkt && pkt->data) {  
        pkt->data = NULL;
        pkt = NULL;  
    }  
    if (pOut && (pOut->data)) {  
        free(pOut->data);  
        pOut->data = NULL;  
        pOut = NULL;
    }   
        pExtra = NULL;  
/*
        mVpu_api.deinit_class_On2Decoder(decHandle);//释放
        mVpu_api.destroy_class_On2Decoder(decHandle);   
        */        
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表