//======================================================================================= // avi decode paser header //======================================================================================= VIDEO_CODEC_STATUS video_decode_paser_header(VIDEO_INFO *video_info, VIDEO_ARGUMENT arg, MEDIA_SOURCE src) { INT32S nRet, video_type; struct sfn_info fd_info; if(video_decode_status() == VIDEO_CODEC_PROCESS_PAUSE) { return VIDEO_CODEC_STATUS_ERR; } if(video_decode_status() == VIDEO_CODEC_PROCESSING) { return VIDEO_CODEC_STATUS_ERR; } if((src.type != SOURCE_TYPE_FS) && (src.type != SOURCE_TYPE_FS_RESOURCE_IN_FILE)) { DEBUG_MSG(DBG_PRINT("Only Support GP File System\r\n")); return VIDEO_CODEC_RESOURCE_NO_FOUND; } if(src.Format.VideoFormat != MJPEG && src.Format.VideoFormat != MPEG4) { DEBUG_MSG(DBG_PRINT("Only Support MJPEG and MPEG4\r\n")); return CHANNEL_ASSIGN_ERROR; } if(src.type_ID.FileHandle < 0) { DEBUG_MSG(DBG_PRINT("File handle Error\r\n")); return RESOURCE_READ_ERROR; } if(src.type == SOURCE_TYPE_FS_RESOURCE_IN_FILE) { video_type = FILE_TYPE_AVI; fd_info.f_size = src.type_ID.temp; } else { sfn_stat(src.type_ID.FileHandle, &fd_info); video_type = vid_dec_get_file_format((INT8S*)fd_info.f_extname); } if(video_type < 0) { close(src.type_ID.FileHandle); return VIDEO_CODEC_STATUS_ERR; } nRet = vid_dec_parser_start(src.type_ID.FileHandle, video_type, fd_info.f_size); if(nRet < 0) { return VIDEO_CODEC_STATUS_ERR; } video_decode_Info(video_info); return VIDEO_CODEC_STATUS_OK; }
//======================================================================================== // video decode set play speed //======================================================================================== VIDEO_CODEC_STATUS video_decode_set_reserve_play(INT32U enable) { if(video_decode_status() == VIDEO_CODEC_PROCESSING) { if(vid_dec_set_reverse_play(enable) < 0) { return VIDEO_CODEC_STATUS_ERR; } } return VIDEO_CODEC_STATUS_OK; }
//======================================================================================== // video decode set play speed //======================================================================================== VIDEO_CODEC_STATUS video_decode_set_play_speed(FP32 speed) { if(video_decode_status() == VIDEO_CODEC_PROCESSING) { if(vid_dec_set_play_speed(speed * 0x10000) < 0) { return VIDEO_CODEC_STATUS_ERR; } } return VIDEO_CODEC_STATUS_OK; }
//======================================================================================= // video decode resume //======================================================================================= VIDEO_CODEC_STATUS video_decode_resume(void) { if(video_decode_status() != VIDEO_CODEC_PROCESS_PAUSE) { return VIDEO_CODEC_STATUS_ERR; } if(vid_dec_resume() < 0) { return VIDEO_CODEC_STATUS_ERR; } return VIDEO_CODEC_STATUS_OK; }
//======================================================================================= // video decode pause //======================================================================================= VIDEO_CODEC_STATUS video_decode_pause(void) { if(video_decode_status() != VIDEO_CODEC_PROCESSING) { return VIDEO_CODEC_STATUS_ERR; } if(vid_dec_pause() < 0) { return VIDEO_CODEC_STATUS_ERR; } return VIDEO_CODEC_STATUS_OK; }
//======================================================================================== // video decode set play time, jump somewhere and play //======================================================================================== VIDEO_CODEC_STATUS video_decode_set_play_time(INT32S SecTime) { if(video_decode_status() == VIDEO_CODEC_PASER_HEADER_FAIL){ return VIDEO_CODEC_STATUS_ERR; } if(video_decode_status() == VIDEO_CODEC_PROCESS_END) { return VIDEO_CODEC_PROCESS_END; } if(SecTime < 0) { SecTime = 0; } if(SecTime >= vid_dec_get_total_time()) { return VIDEO_CODEC_STATUS_ERR; } if(vid_dec_set_play_time(SecTime) < 0) { return VIDEO_CODEC_STATUS_ERR; } return VIDEO_CODEC_STATUS_OK; }
SINT32 ExtGpVideoEngineGetStatus() { return video_decode_status(); }
//================================================================================================= // Platform demo code //================================================================================================= void Platform_Demo_Code(void) { char video_path[32] ="C:\\Demo0091NBA.avi"; char audio_path[32] = "C:\\happy.mp3"; char image_path1[32] = "C:\\chen52.jpg"; char image_path2[32] = "C:\\chen53.jpg"; INT8S volume; INT32S nRet; INT32U decode_output_ptr; AUDIO_ARGUMENT audio_arg; IMAGE_ARGUMENT image_arg; VIDEO_ARGUMENT video_arg; VIDEO_INFO information; MEDIA_SOURCE src; AUDIO_CODEC_STATUS audio_status; IMAGE_CODEC_STATUS image_status; VIDEO_CODEC_STATUS video_status; while(1) { if(_devicemount(USE_DISK)) // Mount device { DBG_PRINT("Mount Disk Fail[%d]\r\n", USE_DISK); #if USE_DISK == FS_NAND1 nRet = _format(FS_NAND1, FAT32_Type); DrvNand_flush_allblk(); _deviceunmount(FS_NAND1); #endif } else { DBG_PRINT("Mount Disk success[%d]\r\n", USE_DISK); break; } } switch(USE_DISK) { case FS_SD: gp_memcpy((INT8S*)video_path, (INT8S*)"C:\\Demo0091NBA.avi", sizeof(video_path)); gp_memcpy((INT8S*)audio_path, (INT8S*)"C:\\happy.mp3", sizeof(audio_path)); gp_memcpy((INT8S*)image_path1, (INT8S*)"C:\\chen52.jpg", sizeof(image_path1)); gp_memcpy((INT8S*)image_path2, (INT8S*)"C:\\chen53.jpg", sizeof(image_path2)); break; case FS_NAND1: gp_memcpy((INT8S*)video_path, (INT8S*)"A:\\Demo0091NBA.avi", sizeof(video_path)); gp_memcpy((INT8S*)audio_path, (INT8S*)"A:\\happy.mp3", sizeof(audio_path)); gp_memcpy((INT8S*)image_path1, (INT8S*)"A:\\chen52.jpg", sizeof(image_path1)); gp_memcpy((INT8S*)image_path2, (INT8S*)"A:\\chen53.jpg", sizeof(image_path2)); break; case FS_USBH: gp_memcpy((INT8S*)video_path, (INT8S*)"G:\\Demo0091NBA.avi", sizeof(video_path)); gp_memcpy((INT8S*)audio_path, (INT8S*)"G:\\happy.mp3", sizeof(audio_path)); gp_memcpy((INT8S*)image_path1, (INT8S*)"G:\\chen52.jpg", sizeof(image_path1)); gp_memcpy((INT8S*)image_path2, (INT8S*)"G:\\chen53.jpg", sizeof(image_path2)); break; } // Initialize display device #if C_DISPLAY_DEVICE >= C_TV_QVGA tv_init(); #if C_DISPLAY_DEVICE == C_TV_QVGA tv_start (TVSTD_NTSC_J_NONINTL, TV_QVGA, TV_NON_INTERLACE); #elif C_DISPLAY_DEVICE == C_TV_VGA tv_start (TVSTD_NTSC_J, TV_HVGA, TV_INTERLACE); #elif C_DISPLAY_DEVICE == C_TV_D1 tv_start (TVSTD_NTSC_J, TV_D1, TV_NON_INTERLACE); #else while(1); #endif #else tft_init(); tft_start(C_DISPLAY_DEVICE); #endif user_defined_video_codec_entrance(); audio_decode_entrance(); image_decode_entrance(); video_decode_entrance(); adc_key_scan_init(); //init key scan volume = 0x3F; nRet = C_DISPLAY_DEV_HPIXEL*C_DISPLAY_DEV_VPIXEL*2; decode_output_ptr = (INT32U) gp_malloc_align(nRet, 64);//malloc decode frame buffer while(!decode_output_ptr); while(1) { adc_key_scan(); if(ADKEY_IO1) { //play audio if(video_decode_status() == VIDEO_CODEC_PROCESS_END) { src.type = SOURCE_TYPE_FS; src.type_ID.FileHandle = open(audio_path, O_RDONLY); src.Format.AudioFormat = MP3; audio_arg.Main_Channel = 1; // Use DAC Channel A+B audio_arg.L_R_Channel = 3; // Left + Right Channel audio_arg.mute = 0; audio_arg.volume = volume; // volume level = 0~63 G_snd_info.Speed = 12; //for speed control(golbal var) G_snd_info.Pitch = 12; //for pitch control(golbal var) audio_status = audio_decode_start(audio_arg, src); } } else if(ADKEY_IO2) { if(audio_decode_status(audio_arg) == AUDIO_CODEC_PROCESSING) audio_decode_stop(audio_arg); } else if(ADKEY_IO3) { //play image if(video_decode_status() == VIDEO_CODEC_PROCESS_END) { src.type = SOURCE_TYPE_FS; if((nRet++ % 2) == 0) src.type_ID.FileHandle = (INT32U)open(image_path1, O_RDONLY); else src.type_ID.FileHandle = (INT32U)open(image_path2, O_RDONLY); image_arg.OutputBufPtr=(INT8U *)decode_output_ptr; //decode output buffer image_arg.OutputBufWidth = C_DISPLAY_DEV_HPIXEL; //width of output buffer image_arg.OutputBufHeight = C_DISPLAY_DEV_VPIXEL; //Heigh of output buffer image_arg.OutputWidth = C_DISPLAY_DEV_HPIXEL; //scaler width of output image image_arg.OutputHeight = C_DISPLAY_DEV_VPIXEL; //scaler Heigh of output image image_arg.OutBoundaryColor = 0x008080; image_arg.ScalerOutputRatio = FIT_OUTPUT_SIZE; image_arg.OutputFormat = IMAGE_OUTPUT_FORMAT_YUYV; image_decode_start(image_arg, src); while (1) { image_status=image_decode_status(); if (image_status == IMAGE_CODEC_DECODE_END) { video_codec_show_image(C_DISPLAY_DEVICE, (INT32U)decode_output_ptr, C_DISPLAY_DEVICE,IMAGE_OUTPUT_FORMAT_YUYV); break; } else if(image_status==IMAGE_CODEC_DECODE_FAIL) { DBG_PRINT("image decode failed\r\n"); break; } } image_encode_stop(); close(src.type_ID.FileHandle); } } else if(ADKEY_IO4) { audio_arg.Main_Channel = 1; if(audio_decode_status(audio_arg) == AUDIO_CODEC_PROCESS_END) { DBG_PRINT("video_decode_start\r\n"); video_arg.bScaler = TRUE; video_arg.bUseDefBuf = FALSE; video_arg.DisplayWidth = C_DISPLAY_DEV_HPIXEL; video_arg.DisplayHeight = C_DISPLAY_DEV_VPIXEL; video_arg.DisplayBufferWidth = C_DISPLAY_DEV_HPIXEL; video_arg.DisplayBufferHeight = C_DISPLAY_DEV_VPIXEL; video_arg.OutputFormat = IMAGE_OUTPUT_FORMAT_YUYV; src.type = SOURCE_TYPE_FS; src.Format.VideoFormat = MJPEG; src.type_ID.FileHandle = open(video_path, O_RDONLY); if(src.type_ID.FileHandle < 0) { DBG_PRINT("file open fail\r\n"); close(src.type_ID.FileHandle); continue; } video_status = video_decode_paser_header(&information, video_arg, src); if(video_status != VIDEO_CODEC_STATUS_OK) { DBG_PRINT("paser header fail !!!\r\n"); continue; } video_decode_start(video_arg, src); audio_decode_volume(volume); } } else if(ADKEY_IO5) { if(video_decode_status() == VIDEO_CODEC_PROCESSING) { video_decode_stop(); DBG_PRINT("video_decode_stop\r\n"); } } else if(ADKEY_IO6) { } else if(ADKEY_IO7) { } else if(ADKEY_IO8) { } } }
//======================================================================================== // get n-th video frame data //======================================================================================== VIDEO_CODEC_STATUS video_decode_get_nth_video_frame(VIDEO_INFO *video_info, VIDEO_ARGUMENT arg, MEDIA_SOURCE src, INT32U nth_frame) { INT16U width, height; INT32S nRet, nTemp; INT32U video_output_format; //check playing if(video_decode_status() == VIDEO_CODEC_PROCESS_PAUSE) { return VIDEO_CODEC_STATUS_ERR; } if(video_decode_status() == VIDEO_CODEC_PROCESSING) { return VIDEO_CODEC_STATUS_ERR; } //format switch(arg.OutputFormat) { case IMAGE_OUTPUT_FORMAT_RGB565: video_output_format = C_SCALER_CTRL_OUT_RGB565; break; case IMAGE_OUTPUT_FORMAT_YUYV: video_output_format = C_SCALER_CTRL_OUT_YUYV; break; case IMAGE_OUTPUT_FORMAT_UYVY: video_output_format = C_SCALER_CTRL_OUT_UYVY; break; #if MCU_VERSION < GPL327XX case IMAGE_OUTPUT_FORMAT_RGB1555: video_output_format = C_SCALER_CTRL_OUT_RGB1555; break; case IMAGE_OUTPUT_FORMAT_RGBG: video_output_format = C_SCALER_CTRL_OUT_RGBG; break; case IMAGE_OUTPUT_FORMAT_GRGB: video_output_format = C_SCALER_CTRL_OUT_GRGB; break; case IMAGE_OUTPUT_FORMAT_YUYV8X32: video_output_format = C_SCALER_CTRL_OUT_YUYV8X32; break; case IMAGE_OUTPUT_FORMAT_YUYV8X64: video_output_format = C_SCALER_CTRL_OUT_YUYV8X64; break; case IMAGE_OUTPUT_FORMAT_YUYV16X32: video_output_format = C_SCALER_CTRL_OUT_YUYV16X32; break; case IMAGE_OUTPUT_FORMAT_YUYV16X64: video_output_format = C_SCALER_CTRL_OUT_YUYV16X64; break; case IMAGE_OUTPUT_FORMAT_YUYV32X32: video_output_format = C_SCALER_CTRL_OUT_YUYV32X32; break; case IMAGE_OUTPUT_FORMAT_YUYV64X64: video_output_format = C_SCALER_CTRL_OUT_YUYV64X64; break; case IMAGE_OUTPUT_FORMAT_YUV422: video_output_format = C_SCALER_CTRL_OUT_YUV422; break; case IMAGE_OUTPUT_FORMAT_YUV420: video_output_format = C_SCALER_CTRL_OUT_YUV420; break; case IMAGE_OUTPUT_FORMAT_YUV411: video_output_format = C_SCALER_CTRL_OUT_YUV411; break; case IMAGE_OUTPUT_FORMAT_YUV444: video_output_format = C_SCALER_CTRL_OUT_YUV444; break; case IMAGE_OUTPUT_FORMAT_Y_ONLY: video_output_format = C_SCALER_CTRL_OUT_Y_ONLY; break; #endif default: return CODEC_START_STATUS_ERROR_MAX; } if(video_decode_paser_header(video_info, arg, src) != VIDEO_CODEC_STATUS_OK) { return VIDEO_CODEC_STATUS_ERR; } //scaler vid_dec_get_size(&width, &height); if(arg.bScaler & 0x01) { p_vid_dec_para->scaler_flag = p_vid_dec_para->user_scaler_flag = C_SCALER_FULL_SCREEN; vid_dec_set_scaler(C_SCALER_FULL_SCREEN, video_output_format, arg.DisplayWidth, arg.DisplayHeight, arg.DisplayBufferWidth, arg.DisplayBufferHeight); } else if(arg.bScaler & 0x02) { p_vid_dec_para->scaler_flag = p_vid_dec_para->user_scaler_flag = C_NO_SCALER_FIT_BUFFER; vid_dec_set_scaler(C_NO_SCALER_FIT_BUFFER, video_output_format, arg.DisplayWidth, arg.DisplayHeight, arg.DisplayBufferWidth, arg.DisplayBufferHeight); } else if(arg.bScaler & 0x04) { p_vid_dec_para->scaler_flag = p_vid_dec_para->user_scaler_flag = C_SCALER_FIT_BUFFER; vid_dec_set_scaler(C_SCALER_FIT_BUFFER, video_output_format, arg.DisplayWidth, arg.DisplayHeight, arg.DisplayBufferWidth, arg.DisplayBufferHeight); } else { p_vid_dec_para->scaler_flag = p_vid_dec_para->user_scaler_flag = C_NO_SCALER; vid_dec_set_scaler(C_NO_SCALER, video_output_format, width, height, width, height); } //deblock vid_dec_set_deblock_flag(FALSE); //user define buffer vid_dec_set_user_define_buffer(arg.bUseDefBuf, (INT32U)arg.AviDecodeBuf1, (INT32U)arg.AviDecodeBuf2); nRet = vid_dec_nth_frame(1); nTemp = vid_dec_parser_stop(); if(nRet < 0 || nTemp < 0) { return VIDEO_CODEC_STATUS_ERR; } return VIDEO_CODEC_STATUS_OK; }