static int rsx_deliver(const frame_info_t *fi, glw_video_t *gv, glw_video_engine_t *gve) { int hvec[3], wvec[3]; int i; int hshift = 1, vshift = 1; glw_video_surface_t *gvs; wvec[0] = fi->fi_width; wvec[1] = fi->fi_width >> hshift; wvec[2] = fi->fi_width >> hshift; hvec[0] = fi->fi_height >> fi->fi_interlaced; hvec[1] = fi->fi_height >> (vshift + fi->fi_interlaced); hvec[2] = fi->fi_height >> (vshift + fi->fi_interlaced); glw_video_configure(gv, gve); gv_color_matrix_set(gv, fi); if((gvs = glw_video_get_surface(gv, NULL, NULL)) == NULL) return -1; surface_reset(gv, gvs); gvs->gvs_offset = fi->fi_pitch[0]; gvs->gvs_size = fi->fi_pitch[1]; gvs->gvs_width[0] = fi->fi_width; gvs->gvs_height[0] = fi->fi_height; int offset = gvs->gvs_offset; if(fi->fi_interlaced) { // Interlaced for(i = 0; i < 3; i++) { int w = wvec[i]; int h = hvec[i]; init_tex(&gvs->gvs_tex[i], offset + !fi->fi_tff * wvec[i], w, h, w*2, NV30_3D_TEX_FORMAT_FORMAT_I8, 0, NV30_3D_TEX_SWIZZLE_S0_X_S1 | NV30_3D_TEX_SWIZZLE_S0_Y_S1 | NV30_3D_TEX_SWIZZLE_S0_Z_S1 | NV30_3D_TEX_SWIZZLE_S0_W_S1 | NV30_3D_TEX_SWIZZLE_S1_X_X | NV30_3D_TEX_SWIZZLE_S1_Y_Y | NV30_3D_TEX_SWIZZLE_S1_Z_Z | NV30_3D_TEX_SWIZZLE_S1_W_W ); offset += w * (fi->fi_height >> (i ? vshift : 0)); } glw_video_put_surface(gv, gvs, fi->fi_pts, fi->fi_epoch, fi->fi_duration/2, 1, !fi->fi_tff); if((gvs = glw_video_get_surface(gv, NULL, NULL)) == NULL) return -1; surface_reset(gv, gvs); gvs->gvs_offset = fi->fi_pitch[0]; gvs->gvs_size = fi->fi_pitch[1]; gvs->gvs_width[0] = fi->fi_width; gvs->gvs_height[0] = fi->fi_height; offset = gvs->gvs_offset; for(i = 0; i < 3; i++) { int w = wvec[i]; int h = hvec[i]; init_tex(&gvs->gvs_tex[i], offset + !!fi->fi_tff * wvec[i], w, h, w*2, NV30_3D_TEX_FORMAT_FORMAT_I8, 0, NV30_3D_TEX_SWIZZLE_S0_X_S1 | NV30_3D_TEX_SWIZZLE_S0_Y_S1 | NV30_3D_TEX_SWIZZLE_S0_Z_S1 | NV30_3D_TEX_SWIZZLE_S0_W_S1 | NV30_3D_TEX_SWIZZLE_S1_X_X | NV30_3D_TEX_SWIZZLE_S1_Y_Y | NV30_3D_TEX_SWIZZLE_S1_Z_Z | NV30_3D_TEX_SWIZZLE_S1_W_W ); offset += w * (fi->fi_height >> (i ? vshift : 0)); } glw_video_put_surface(gv, gvs, fi->fi_pts + fi->fi_duration, fi->fi_epoch, fi->fi_duration/2, 1, fi->fi_tff); } else { // Progressive for(i = 0; i < 3; i++) {
void glw_video_input_yuvp(glw_video_t *gv, uint8_t * const data[], const int pitch[], const frame_info_t *fi) { int hvec[3], wvec[3]; int i, h, w; uint8_t *src; uint8_t *dst; int tff; int hshift, vshift; glw_video_surface_t *s; const int parity = 0; int64_t pts = fi->pts; avcodec_get_chroma_sub_sample(fi->pix_fmt, &hshift, &vshift); wvec[0] = fi->width; wvec[1] = fi->width >> hshift; wvec[2] = fi->width >> hshift; hvec[0] = fi->height >> fi->interlaced; hvec[1] = fi->height >> (vshift + fi->interlaced); hvec[2] = fi->height >> (vshift + fi->interlaced); if(glw_video_configure(gv, &glw_video_opengl, wvec, hvec, 3, fi->interlaced ? (GVC_YHALF | GVC_CUTBORDER) : 0)) return; gv_color_matrix_set(gv, fi); if((s = glw_video_get_surface(gv)) == NULL) return; if(!fi->interlaced) { for(i = 0; i < 3; i++) { w = wvec[i]; h = hvec[i]; src = data[i]; dst = s->gvs_data[i]; while(h--) { memcpy(dst, src, w); dst += w; src += pitch[i]; } } glw_video_put_surface(gv, s, pts, fi->epoch, fi->duration, 0); } else { int duration = fi->duration >> 1; tff = fi->tff ^ parity; for(i = 0; i < 3; i++) { w = wvec[i]; h = hvec[i]; src = data[i]; dst = s->gvs_data[i]; while(h -= 2 > 0) { memcpy(dst, src, w); dst += w; src += pitch[i] * 2; } } glw_video_put_surface(gv, s, pts, fi->epoch, duration, !tff); if((s = glw_video_get_surface(gv)) == NULL) return; for(i = 0; i < 3; i++) { w = wvec[i]; h = hvec[i]; src = data[i] + pitch[i]; dst = s->gvs_data[i]; while(h -= 2 > 0) { memcpy(dst, src, w); dst += w; src += pitch[i] * 2; } } if(pts != AV_NOPTS_VALUE) pts += duration; glw_video_put_surface(gv, s, pts, fi->epoch, duration, tff); } }
static int yuvp_deliver(const frame_info_t *fi, glw_video_t *gv, glw_video_engine_t *gve) { int hvec[3], wvec[3]; int i, h, w; const uint8_t *src; uint8_t *dst; int tff; int hshift = fi->fi_hshift, vshift = fi->fi_vshift; glw_video_surface_t *s; const int parity = 0; wvec[0] = fi->fi_width; wvec[1] = fi->fi_width >> hshift; wvec[2] = fi->fi_width >> hshift; hvec[0] = fi->fi_height >> fi->fi_interlaced; hvec[1] = fi->fi_height >> (vshift + fi->fi_interlaced); hvec[2] = fi->fi_height >> (vshift + fi->fi_interlaced); glw_video_configure(gv, gve); gv_color_matrix_set(gv, fi); if((s = glw_video_get_surface(gv, wvec, hvec)) == NULL) return -1; if(!fi->fi_interlaced) { for(i = 0; i < 3; i++) { w = wvec[i]; h = hvec[i]; src = fi->fi_data[i]; dst = s->gvs_data[i]; while(h--) { memcpy(dst, src, w); dst += w; src += fi->fi_pitch[i]; } } glw_video_put_surface(gv, s, fi->fi_pts, fi->fi_epoch, fi->fi_duration, 0, 0); } else { int duration = fi->fi_duration >> 1; tff = fi->fi_tff ^ parity; for(i = 0; i < 3; i++) { w = wvec[i]; h = hvec[i]; src = fi->fi_data[i]; dst = s->gvs_data[i]; while(h--) { memcpy(dst, src, w); dst += w; src += fi->fi_pitch[i] * 2; } } glw_video_put_surface(gv, s, fi->fi_pts, fi->fi_epoch, duration, 1, !tff); if((s = glw_video_get_surface(gv, wvec, hvec)) == NULL) return -1; for(i = 0; i < 3; i++) { w = wvec[i]; h = hvec[i]; src = fi->fi_data[i] + fi->fi_pitch[i]; dst = s->gvs_data[i]; while(h--) { memcpy(dst, src, w); dst += w; src += fi->fi_pitch[i] * 2; } } glw_video_put_surface(gv, s, fi->fi_pts + duration, fi->fi_epoch, duration, 1, tff); } return 0; }
void glw_video_input_rsx_mem(glw_video_t *gv, void *frame, const frame_info_t *fi) { rsx_video_frame_t *rvf = frame; int hvec[3], wvec[3]; int i; int hshift, vshift; glw_video_surface_t *gvs; avcodec_get_chroma_sub_sample(fi->fi_pix_fmt, &hshift, &vshift); wvec[0] = fi->fi_width; wvec[1] = fi->fi_width >> hshift; wvec[2] = fi->fi_width >> hshift; hvec[0] = fi->fi_height >> fi->fi_interlaced; hvec[1] = fi->fi_height >> (vshift + fi->fi_interlaced); hvec[2] = fi->fi_height >> (vshift + fi->fi_interlaced); if(glw_video_configure(gv, &glw_video_rsxmem, wvec, hvec, 3, fi->fi_interlaced ? (GVC_YHALF | GVC_CUTBORDER) : 0)) return; gv_color_matrix_set(gv, fi); if((gvs = glw_video_get_surface(gv)) == NULL) return; surface_reset(gv, gvs); gvs->gvs_size = rvf->rvf_size; gvs->gvs_offset = rvf->rvf_offset; int offset = gvs->gvs_offset; if(fi->fi_interlaced) { // Interlaced for(i = 0; i < 3; i++) { int w = wvec[i]; int h = hvec[i]; init_tex(&gvs->gvs_tex[i], offset + !fi->fi_tff * wvec[i], w, h, w*2, NV30_3D_TEX_FORMAT_FORMAT_I8, 0, NV30_3D_TEX_SWIZZLE_S0_X_S1 | NV30_3D_TEX_SWIZZLE_S0_Y_S1 | NV30_3D_TEX_SWIZZLE_S0_Z_S1 | NV30_3D_TEX_SWIZZLE_S0_W_S1 | NV30_3D_TEX_SWIZZLE_S1_X_X | NV30_3D_TEX_SWIZZLE_S1_Y_Y | NV30_3D_TEX_SWIZZLE_S1_Z_Z | NV30_3D_TEX_SWIZZLE_S1_W_W ); offset += w * (fi->fi_height >> (i ? vshift : 0)); } glw_video_put_surface(gv, gvs, fi->fi_pts, fi->fi_epoch, fi->fi_duration/2, 0); if((gvs = glw_video_get_surface(gv)) == NULL) return; surface_reset(gv, gvs); gvs->gvs_size = rvf->rvf_size; gvs->gvs_offset = rvf->rvf_offset; offset = gvs->gvs_offset; for(i = 0; i < 3; i++) { int w = wvec[i]; int h = hvec[i]; init_tex(&gvs->gvs_tex[i], offset + !!fi->fi_tff * wvec[i], w, h, w*2, NV30_3D_TEX_FORMAT_FORMAT_I8, 0, NV30_3D_TEX_SWIZZLE_S0_X_S1 | NV30_3D_TEX_SWIZZLE_S0_Y_S1 | NV30_3D_TEX_SWIZZLE_S0_Z_S1 | NV30_3D_TEX_SWIZZLE_S0_W_S1 | NV30_3D_TEX_SWIZZLE_S1_X_X | NV30_3D_TEX_SWIZZLE_S1_Y_Y | NV30_3D_TEX_SWIZZLE_S1_Z_Z | NV30_3D_TEX_SWIZZLE_S1_W_W ); offset += w * (fi->fi_height >> (i ? vshift : 0)); } glw_video_put_surface(gv, gvs, fi->fi_pts + fi->fi_duration, fi->fi_epoch, fi->fi_duration/2, 0); } else { // Progressive for(i = 0; i < 3; i++) {