savage_vid.c
来自「linux下的MPEG1」· C语言 代码 · 共 1,473 行 · 第 1/3 页
C
1,473 行
/* This maps framebuffer @6MB, thus 2MB are left for video. */ if (info->chip.arch == S3_SAVAGE3D) { info->video_base = map_phys_mem(pci_info.base0, info->chip.fbsize); info->picture_offset = 1024*768* 4 * ((info->chip.fbsize > 4194304)?2:1); } else { info->video_base = map_phys_mem(pci_info.base1, info->chip.fbsize); info->picture_offset = info->chip.fbsize - FRAMEBUFFER_SIZE;// info->picture_offset = 1024*1024* 4 * 2; } if ( info->video_base < 0 ){ printf("errno = %s\n", strerror(errno)); return -1; } info->picture_base = (uint32_t) info->video_base + info->picture_offset; if ( info->chip.arch == S3_SAVAGE3D ){ mtrr = mtrr_set_type(pci_info.base0, info->chip.fbsize, MTRR_TYPE_WRCOMB); } else{ mtrr = mtrr_set_type(pci_info.base1, info->chip.fbsize, MTRR_TYPE_WRCOMB); } if (mtrr!= 0) printf("[savage_vid] unable to setup MTRR: %s\n", strerror(mtrr)); else printf("[savage_vid] MTRR set up\n"); /* This may trash your screen for resolutions greater than 1024x768, sorry. */ savage_getscreenproperties(info);// return -1; info->videoFlags = 0; SavageStreamsOn(); //getc(stdin); //FIXME ADD return 0;}/** * @brief Destroys driver. */voidvixDestroy (void){ unmap_phys_mem(info->video_base, info->chip.fbsize); unmap_phys_mem(info->control_base, SAVAGE_NEWMMIO_REGSIZE); //FIXME ADD}/** * @brief Get chipset's hardware capabilities. * * @param to Pointer to the vidix_capability_t structure to be filled. * * @returns 0. */intvixGetCapability (vidix_capability_t * to){ memcpy (to, &savage_cap, sizeof (vidix_capability_t)); return 0;}/** * @brief Report if the video FourCC is supported by hardware. * * @param fourcc input image format. * * @returns 1 if the fourcc is supported. * 0 otherwise. */static intis_supported_fourcc (uint32_t fourcc){ switch (fourcc) {//FIXME: YV12 isnt working properly yet // case IMGFMT_YV12:// case IMGFMT_I420: case IMGFMT_UYVY: case IMGFMT_YVYU: case IMGFMT_YUY2: case IMGFMT_RGB15: case IMGFMT_RGB16:// case IMGFMT_BGR32: return 1; default: return 0; }}/** * @brief Try to configure video memory for given fourcc. * * @param to Pointer to the vidix_fourcc_t structure to be filled. * * @returns 0 if ok. * errno otherwise. */intvixQueryFourcc (vidix_fourcc_t * to){ if (is_supported_fourcc (to->fourcc)) { to->depth = VID_DEPTH_1BPP | VID_DEPTH_2BPP | VID_DEPTH_4BPP | VID_DEPTH_8BPP | VID_DEPTH_12BPP | VID_DEPTH_15BPP | VID_DEPTH_16BPP | VID_DEPTH_24BPP | VID_DEPTH_32BPP; to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY; return 0; } else to->depth = to->flags = 0; return ENOSYS;}/** * @brief Get the GrKeys * * @param grkey Pointer to the vidix_grkey_t structure to be filled by driver. * * @return 0. *//*intvixGetGrKeys (vidix_grkey_t * grkey){// if(info->d_width && info->d_height)savage_overlay_start(info,0); return (0);} * *//** * @brief Set the GrKeys * * @param grkey Colorkey to be set. * * @return 0. */intvixSetGrKeys (const vidix_grkey_t * grkey){ if (grkey->ckey.op == CKEY_FALSE) { info->use_colorkey = 0; info->vidixcolorkey=0; printf("[savage_vid] colorkeying disabled\n"); } else { info->use_colorkey = 1; info->vidixcolorkey = ((grkey->ckey.red<<16)|(grkey->ckey.green<<8)|grkey->ckey.blue); printf("[savage_vid] set colorkey 0x%x\n",info->vidixcolorkey); } //FIXME: freezes if streams arent enabled SavageSetColorKeyOld(); return (0);}/** * @brief Unichrome driver equalizer capabilities. */vidix_video_eq_t equal = { VEQ_CAP_BRIGHTNESS | VEQ_CAP_SATURATION | VEQ_CAP_HUE, 300, 100, 0, 0, 0, 0, 0, 0};/** * @brief Get the equalizer capabilities. * * @param eq Pointer to the vidix_video_eq_t structure to be filled by driver. * * @return 0. */intvixPlaybackGetEq (vidix_video_eq_t * eq){ memcpy (eq, &equal, sizeof (vidix_video_eq_t)); return 0;}/** * @brief Set the equalizer capabilities for color correction * * @param eq equalizer capabilities to be set. * * @return 0. */intvixPlaybackSetEq (const vidix_video_eq_t * eq){ return 0;}/** * @brief Y, U, V offsets. *//* static int YOffs, UOffs, VOffs; *//** * @brief Configure driver for playback. Driver should prepare BES. * * @param info configuration description for playback. * * @returns 0 in case of success. * -1 otherwise. */intvixConfigPlayback (vidix_playback_t * vinfo){ int uv_size, swap_uv; unsigned int i;#if 0 int extfifo_on; int srcPitch,srcPitch2; /* Overlay register settings */ uint32_t win_start, win_end; uint32_t zoom, mini; uint32_t dcount, falign, qwfetch; uint32_t y_start, u_start, v_start; uint32_t v_ctrl, fifo_ctrl;#endif if (!is_supported_fourcc (vinfo->fourcc)) return -1; info->src_w = vinfo->src.w; info->src_h = vinfo->src.h; info->drw_w = vinfo->dest.w; info->drw_h = vinfo->dest.h; info->wx = vinfo->dest.x; info->wy = vinfo->dest.y; info->format = vinfo->fourcc; info->lastKnownPitch = 0; info->brightness = 0; info->contrast = 128; info->saturation = 128; info->hue = 0; vinfo->dga_addr=(void*)(info->picture_base); vinfo->offset.y = 0; vinfo->offset.v = 0; vinfo->offset.u = 0; vinfo->dest.pitch.y = 32; vinfo->dest.pitch.u = 32; vinfo->dest.pitch.v = 32; // vinfo->dest.pitch.u = 0; // vinfo->dest.pitch.v = 0; info->pitch = ((info->src_w << 1) + 15) & ~15; swap_uv = 0; switch (vinfo->fourcc) { case IMGFMT_YUY2: case IMGFMT_UYVY: info->pitch = ((info->src_w << 1) + (vinfo->dest.pitch.y-1)) & ~(vinfo->dest.pitch.y-1); info->pitch = info->src_w << 1; info->pitch = ALIGN_TO (info->src_w << 1, 32); uv_size = 0; break; case IMGFMT_YV12: swap_uv = 1; /* srcPitch = (info->src_w + 3) & ~3; vinfo->offset.u = srcPitch * info->src_h; srcPitch2 = ((info->src_w >> 1) + 3) & ~3; vinfo->offset.v = (srcPitch2 * (info->src_h >> 1)) + vinfo->offset.v; vinfo->dest.pitch.y=srcPitch ; vinfo->dest.pitch.v=srcPitch2 ; vinfo->dest.pitch.u=srcPitch2 ; */ info->pitch = ALIGN_TO (info->src_w, 32); uv_size = (info->pitch >> 1) * (info->src_h >> 1); vinfo->offset.y = 0; vinfo->offset.v = vinfo->offset.y + info->pitch * info->src_h; vinfo->offset.u = vinfo->offset.v + uv_size; vinfo->frame_size = vinfo->offset.u + uv_size;/* YOffs = info->offset.y; UOffs = (swap_uv ? vinfo->offset.v : vinfo->offset.u); VOffs = (swap_uv ? vinfo->offset.u : vinfo->offset.v); */// vinfo->offset.y = info->src_w;// vinfo->offset.v = vinfo->offset.y + info->src_w /2 * info->src_h;// vinfo->offset.u = vinfo->offset.v + (info->src_w >> 1) * (info->src_h >> 1) ; break; } info->pitch |= ((info->pitch >> 1) << 16); vinfo->frame_size = info->pitch * info->src_h; printf("$#### destination pitch = %u\n", info->pitch&0xffff); info->buffer_size = vinfo->frame_size; info->num_frames = vinfo->num_frames= (info->chip.fbsize - info->picture_offset)/vinfo->frame_size; if(vinfo->num_frames > MAX_FRAMES)vinfo->num_frames = MAX_FRAMES;// vinfo->num_frames = 1;// printf("[nvidia_vid] Number of frames %i\n",vinfo->num_frames); for(i=0;i <vinfo->num_frames;i++)vinfo->offsets[i] = vinfo->frame_size*i; return 0;}/** * @brief Set playback on : driver should activate BES on this call. * * @return 0. */intvixPlaybackOn (void){ // FIXME: enable SavageDisplayVideoOld();//FIXME ADD return 0;}/** * @brief Set playback off : driver should deactivate BES on this call. * * @return 0. */intvixPlaybackOff (void){ // otherwise we wont disable streams properly in new xorg // FIXME: shouldnt this be enabled?// SavageStreamsOn(); SavageStreamsOff();// info->vidixcolorkey=0x0;// OUTREG( SSTREAM_WINDOW_START_REG, OS_XY(0xfffe, 0xfffe) );// SavageSetColorKeyOld();//FIXME ADD return 0;}/** * @brief Driver should prepare and activate corresponded frame. * * @param frame the frame index. * * @return 0. * * @note This function is used only for double and triple buffering * and never used for single buffering playback. */#if 0intvixPlaybackFrameSelect (unsigned int frame){////FIXME ADD// savage_overlay_start(info, frame); //if (info->num_frames >= 1)// info->cur_frame = frame//(frame+1)%info->num_frames;//// savage4_waitidle(info); printf("vixPlaybackFrameSelect Leave\n" ); // FIXME: does this work to avoid tearing?// VerticalRetraceWait(); return 0;}#endif void debugout(unsigned int addr, unsigned int val){ return ; switch ( addr ){ case PSTREAM_CONTROL_REG: fprintf(stderr,"PSTREAM_CONTROL_REG"); break; case COL_CHROMA_KEY_CONTROL_REG: fprintf(stderr,"COL_CHROMA_KEY_CONTROL_REG"); break; case SSTREAM_CONTROL_REG: fprintf(stderr,"SSTREAM_CONTROL_REG"); break; case CHROMA_KEY_UPPER_BOUND_REG: fprintf(stderr,"CHROMA_KEY_UPPER_BOUND_REG"); break; case SSTREAM_STRETCH_REG: fprintf(stderr,"SSTREAM_STRETCH_REG"); break; case COLOR_ADJUSTMENT_REG: fprintf(stderr,"COLOR_ADJUSTMENT_REG"); break; case BLEND_CONTROL_REG: fprintf(stderr,"BLEND_CONTROL_REG"); break; case PSTREAM_FBADDR0_REG: fprintf(stderr,"PSTREAM_FBADDR0_REG"); break; case PSTREAM_FBADDR1_REG: fprintf(stderr,"PSTREAM_FBADDR1_REG"); break; case PSTREAM_STRIDE_REG: fprintf(stderr,"PSTREAM_STRIDE_REG"); break; case DOUBLE_BUFFER_REG: fprintf(stderr,"DOUBLE_BUFFER_REG"); break; case SSTREAM_FBADDR0_REG: fprintf(stderr,"SSTREAM_FBADDR0_REG"); break; case SSTREAM_FBADDR1_REG: fprintf(stderr,"SSTREAM_FBADDR1_REG"); break; case SSTREAM_STRIDE_REG: fprintf(stderr,"SSTREAM_STRIDE_REG"); break; case SSTREAM_VSCALE_REG: fprintf(stderr,"SSTREAM_VSCALE_REG"); break; case SSTREAM_VINITIAL_REG: fprintf(stderr,"SSTREAM_VINITIAL_REG"); break; case SSTREAM_LINES_REG: fprintf(stderr,"SSTREAM_LINES_REG"); break; case STREAMS_FIFO_REG: fprintf(stderr,"STREAMS_FIFO_REG"); break; case PSTREAM_WINDOW_START_REG: fprintf(stderr,"PSTREAM_WINDOW_START_REG"); break; case PSTREAM_WINDOW_SIZE_REG: fprintf(stderr,"PSTREAM_WINDOW_SIZE_REG"); break; case SSTREAM_WINDOW_START_REG: fprintf(stderr,"SSTREAM_WINDOW_START_REG"); break; case SSTREAM_WINDOW_SIZE_REG: fprintf(stderr,"SSTREAM_WINDOW_SIZE_REG"); break; case FIFO_CONTROL: fprintf(stderr,"FIFO_CONTROL"); break; case PSTREAM_FBSIZE_REG: fprintf(stderr,"PSTREAM_FBSIZE_REG"); break; case SSTREAM_FBSIZE_REG: fprintf(stderr,"SSTREAM_FBSIZE_REG"); break; case SSTREAM_FBADDR2_REG: fprintf(stderr,"SSTREAM_FBADDR2_REG"); break; } fprintf(stderr,":\t\t 0x%08X = %u\n",val,val);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?