Commit a0530f4a authored by Laurent Aimar's avatar Laurent Aimar

Factorized Direct3DLockSurface/DirectXLock.

There is a little difference in Direct3DLockSurface as it now also
sets the height field, but it should have no functionnal changes.
parent d0606472
...@@ -214,6 +214,39 @@ void CommonDisplay(vout_display_t *vd) ...@@ -214,6 +214,39 @@ void CommonDisplay(vout_display_t *vd)
sys->is_first_display = false; sys->is_first_display = false;
} }
/**
* It updates a picture data/pitches.
*/
void CommonUpdatePicture(picture_t *picture,
uint8_t *data, unsigned pitch)
{
/* fill in buffer info in first plane */
picture->p->p_pixels = data;
picture->p->i_pitch = pitch;
picture->p->i_lines = picture->format.i_height;
/* Fill chroma planes for planar YUV */
if (picture->format.i_chroma == VLC_CODEC_I420 ||
picture->format.i_chroma == VLC_CODEC_J420 ||
picture->format.i_chroma == VLC_CODEC_YV12) {
for (int n = 1; n < picture->i_planes; n++) {
const plane_t *o = &picture->p[n-1];
plane_t *p = &picture->p[n];
p->p_pixels = o->p_pixels + o->i_lines * o->i_pitch;
p->i_pitch = pitch / 2;
p->i_lines = picture->format.i_height / 2;
}
/* The dx/d3d buffer is always allocated as YV12 */
if (vlc_fourcc_AreUVPlanesSwapped(picture->format.i_chroma, VLC_CODEC_YV12)) {
uint8_t *p_tmp = picture->p[1].p_pixels;
picture->p[1].p_pixels = picture->p[2].p_pixels;
picture->p[2].p_pixels = p_tmp;
}
}
}
void AlignRect(RECT *r, int align_boundary, int align_size) void AlignRect(RECT *r, int align_boundary, int align_size)
{ {
if (align_boundary) if (align_boundary)
......
...@@ -237,6 +237,7 @@ void CommonClean(vout_display_t *); ...@@ -237,6 +237,7 @@ void CommonClean(vout_display_t *);
void CommonManage(vout_display_t *); void CommonManage(vout_display_t *);
int CommonControl(vout_display_t *, int , va_list ); int CommonControl(vout_display_t *, int , va_list );
void CommonDisplay(vout_display_t *); void CommonDisplay(vout_display_t *);
void CommonUpdatePicture(picture_t *, uint8_t *, unsigned);
void UpdateRects (vout_display_t *, void UpdateRects (vout_display_t *,
const vout_display_cfg_t *, const vout_display_cfg_t *,
......
...@@ -761,29 +761,7 @@ static int Direct3DLockSurface(picture_t *picture) ...@@ -761,29 +761,7 @@ static int Direct3DLockSurface(picture_t *picture)
return VLC_EGENERIC; return VLC_EGENERIC;
} }
/* fill in buffer info in first plane */ CommonUpdatePicture(picture, d3drect.pBits, d3drect.Pitch);
picture->p->p_pixels = d3drect.pBits;
picture->p->i_pitch = d3drect.Pitch;
/* Fill chroma planes for planar YUV */
if (picture->format.i_chroma == VLC_CODEC_I420 ||
picture->format.i_chroma == VLC_CODEC_J420 ||
picture->format.i_chroma == VLC_CODEC_YV12) {
for (int n = 1; n < picture->i_planes; n++) {
const plane_t *o = &picture->p[n-1];
plane_t *p = &picture->p[n];
p->p_pixels = o->p_pixels + o->i_lines * o->i_pitch;
p->i_pitch = d3drect.Pitch / 2;
}
/* The d3d buffer is always allocated as YV12 */
if (vlc_fourcc_AreUVPlanesSwapped(picture->format.i_chroma, VLC_CODEC_YV12)) {
uint8_t *p_tmp = picture->p[1].p_pixels;
picture->p[1].p_pixels = picture->p[2].p_pixels;
picture->p[2].p_pixels = p_tmp;
}
}
return VLC_SUCCESS; return VLC_SUCCESS;
} }
/** /**
......
...@@ -1223,31 +1223,7 @@ static int DirectXLock(picture_t *picture) ...@@ -1223,31 +1223,7 @@ static int DirectXLock(picture_t *picture)
picture->p_sys->surface, &ddsd)) picture->p_sys->surface, &ddsd))
return VLC_EGENERIC; return VLC_EGENERIC;
/* fill in buffer info in first plane */ CommonUpdatePicture(picture, ddsd.lpSurface, ddsd.lPitch);
picture->p->p_pixels = ddsd.lpSurface;
picture->p->i_pitch = ddsd.lPitch;
picture->p->i_lines = picture->format.i_height;
/* Fill chroma planes for planar YUV */
if (picture->format.i_chroma == VLC_CODEC_I420 ||
picture->format.i_chroma == VLC_CODEC_J420 ||
picture->format.i_chroma == VLC_CODEC_YV12) {
for (int n = 1; n < picture->i_planes; n++) {
const plane_t *o = &picture->p[n-1];
plane_t *p = &picture->p[n];
p->p_pixels = o->p_pixels + o->i_lines * o->i_pitch;
p->i_pitch = ddsd.lPitch / 2;
p->i_lines = picture->format.i_height / 2;
}
/* The dx buffer is always allocated as YV12 */
if (vlc_fourcc_AreUVPlanesSwapped(picture->format.i_chroma, VLC_CODEC_YV12)) {
uint8_t *p_tmp = picture->p[1].p_pixels;
picture->p[1].p_pixels = picture->p[2].p_pixels;
picture->p[2].p_pixels = p_tmp;
}
}
return VLC_SUCCESS; return VLC_SUCCESS;
} }
static void DirectXUnlock(picture_t *picture) static void DirectXUnlock(picture_t *picture)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment