⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dspmain.c

📁 decode the h264 video
💻 C
字号:
#define USE_IEKC64
#define USE_IEKC64_TASK

#ifndef USE_IEKC64 ////////////////////////////////////////////////////////////

#include "h264.h"

void main() {
  frame *f;
  h264_open("");
  for(;;) {
    f=h264_decode_frame(1);
    printf("FRAME DECODED @ %p\n",f);
  }
  h264_close();
}

#else /////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <csl.h>
#include <csl_edma.h>
#include <csl_dat.h>

#include <std.h>
#include <sys.h>
#include <tsk.h>

#include "agl.h"
#include "agl_conv.h"
#include "iekc64.h"

#include "h264.h"


#define OUT_WIDTH  352
#define OUT_HEIGHT 576
#define OUT_RES    RES_VGA_PAL_352X576

#define OUT_Y_SIZE (OUT_WIDTH*OUT_HEIGHT)
#define OUT_C_SIZE (OUT_Y_SIZE/2)


void mem_stat(int segid, char *segname) {
  struct MEM_Stat stat;
  MEM_stat(segid,&stat);
  printf("%s (0x%08X) has %d bytes, %d used, %d free\n",
         segname,segid,stat.size,stat.used,stat.length);
}


void tsk_main() {
  Uint32 CoreClock,BiosClock;
  IEKC64_STATUS status;
  IEKC64_VIDEOOUT out_params;
  Handle out;
  Uint16 *rgb,*screen;
  Uint16 *src,*dest,*dstart;
  frame *f;
  int x,y,sx,sy;
  
  LED_set(BRACKET_RED, ON);
  LED_set(BRACKET_GREEN, OFF);
  
  CoreClock=IEKC64_getCpuClock(&BiosClock);
  printf("C64xx @ %u MHz, DSP/BIOS @ %u MHz\n",CoreClock,BiosClock);

  out_params.Standard=PAL;
  out_params.Resolution=OUT_RES;
  out_params.FrameFormat=RGB565PIXEL;
  out_params.VideoOutSelect=VGA;
  if(!IEKC64_SUCCESS(status=VOUT_open(&out_params,&out))) {
    printf("Cannot open VideoOut, status 0x%08X\n",status);
    return;
  }
  if(!IEKC64_SUCCESS(status=VOUT_start(out))) {
    printf("Cannot start VideoOut, status 0x%08X\n",status);
    return;
  }
  if(!(screen=(Uint16*)MEM_alloc(seg_sdrama,OUT_WIDTH*OUT_HEIGHT*2,4))) {
    printf("Cannot allocate Frame Buffer Memory\n");
    return;
  }
  memset(screen,0,OUT_WIDTH*OUT_HEIGHT*2);
  VOUT_putFrame(out,screen,IEKC64_VIDEO_NO_WAIT);
  LED_set(BRACKET_RED, OFF);

  x=h264_open("");
  sx=H264_WIDTH(x);
  sy=H264_HEIGHT(x);
  if(!(rgb=(Uint16*)MEM_alloc(seg_sdrama,OUT_WIDTH*OUT_HEIGHT*2,4))) {
    printf("Cannot allocate intermediate buffer\n");
    return;
  }
  dstart=&screen[(OUT_HEIGHT/2-sy)*OUT_WIDTH+(OUT_WIDTH-sx)/2];
  
  do {
    LED_set(BRACKET_GREEN, ON);
    f=h264_decode_frame(1); printf("\n");
    LED_set(BRACKET_GREEN, OFF);
    
    CONV_IYUVtoRGB16(CONV_RgbCoef,f->L,f->C[0],f->C[1],rgb,sx,sy);
    src=rgb; dest=dstart;
    for(y=sy; y; --y) {
      memcpy(dest,src,sx*2); dest+=OUT_WIDTH;
      memcpy(dest,src,sx*2); dest+=OUT_WIDTH;
      src+=sx;
    }
    
    VOUT_waitDisplayed(out,IEKC64_VIDEO_WAIT_INFINITE);
    VOUT_putFrame(out,screen,IEKC64_VIDEO_NO_WAIT);
  } while(1);
  h264_close();

  abort();
  //VOUT_stop(out);
}


main() {
  IEKC64_STATUS status;
#ifdef USE_IEKC64_TASK
  TSK_Attrs att;
#endif

  CSL_init();
  mem_stat(seg_isram,"ISRAM");
  mem_stat(seg_sdrama,"SDRAMA");
  mem_stat(seg_sdramb,"SDRAMB");

  printf("Initializing IEKC64 ...\n");
  status=IEKC64_init();
  if(!IEKC64_SUCCESS(status)) {
    printf("Cannot initialize IEKC64, status 0x%08X\n",status);
    abort();
  }
  printf("IEKC64 initialized.\n");

#ifdef USE_IEKC64_TASK
  att=TSK_ATTRS;
  att.priority=4;
  att.stacksize=9024;
  att.stackseg=seg_sdrama;
  TSK_create((Fxn)tsk_main,&att);
#else
  tsk_main();
#endif
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -