ffmpegcolorspace: Include interlacing information in the AVPicture

This later allows to handle interlaced AVPicture different than
progressive ones which is needed for horizontally subsampled YUV
formats, see bug #589242.
This commit is contained in:
Sebastian Dröge 2009-07-28 14:12:31 +02:00
parent 33c490f4b9
commit 164b90f9d0
6 changed files with 22 additions and 8 deletions

View file

@ -190,6 +190,7 @@ typedef struct AVCodecContext {
typedef struct AVPicture { typedef struct AVPicture {
uint8_t *data[4]; uint8_t *data[4];
int linesize[4]; ///< number of bytes per line int linesize[4]; ///< number of bytes per line
int interlaced;
} AVPicture; } AVPicture;
/** /**

View file

@ -801,7 +801,8 @@ gst_ffmpegcsp_caps_with_codectype (enum CodecType type,
*/ */
int int
gst_ffmpegcsp_avpicture_fill (AVPicture * picture, gst_ffmpegcsp_avpicture_fill (AVPicture * picture,
uint8_t * ptr, enum PixelFormat pix_fmt, int width, int height) uint8_t * ptr, enum PixelFormat pix_fmt, int width, int height,
int interlaced)
{ {
int size, w2, h2, size2; int size, w2, h2, size2;
int stride, stride2; int stride, stride2;
@ -809,6 +810,8 @@ gst_ffmpegcsp_avpicture_fill (AVPicture * picture,
pinfo = get_pix_fmt_info (pix_fmt); pinfo = get_pix_fmt_info (pix_fmt);
picture->interlaced = interlaced;
switch (pix_fmt) { switch (pix_fmt) {
case PIX_FMT_YUV420P: case PIX_FMT_YUV420P:
case PIX_FMT_YUV422P: case PIX_FMT_YUV422P:

View file

@ -51,7 +51,8 @@ gst_ffmpegcsp_avpicture_fill (AVPicture * picture,
uint8_t * ptr, uint8_t * ptr,
enum PixelFormat pix_fmt, enum PixelFormat pix_fmt,
int width, int width,
int height); int height,
int interlaced);
#endif /* __GST_FFMPEG_CODECMAP_H__ */ #endif /* __GST_FFMPEG_CODECMAP_H__ */

View file

@ -219,6 +219,9 @@ gst_ffmpegcsp_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
space->width = ctx->width = in_width; space->width = ctx->width = in_width;
space->height = ctx->height = in_height; space->height = ctx->height = in_height;
space->interlaced = FALSE;
gst_structure_get_boolean (structure, "interlaced", &space->interlaced);
/* get from format */ /* get from format */
ctx->pix_fmt = PIX_FMT_NB; ctx->pix_fmt = PIX_FMT_NB;
gst_ffmpegcsp_caps_with_codectype (CODEC_TYPE_VIDEO, incaps, ctx); gst_ffmpegcsp_caps_with_codectype (CODEC_TYPE_VIDEO, incaps, ctx);
@ -445,7 +448,8 @@ gst_ffmpegcsp_transform (GstBaseTransform * btrans, GstBuffer * inbuf,
/* fill from with source data */ /* fill from with source data */
gst_ffmpegcsp_avpicture_fill (&space->from_frame, gst_ffmpegcsp_avpicture_fill (&space->from_frame,
GST_BUFFER_DATA (inbuf), space->from_pixfmt, space->width, space->height); GST_BUFFER_DATA (inbuf), space->from_pixfmt, space->width, space->height,
space->interlaced);
/* fill optional palette */ /* fill optional palette */
if (space->palette) if (space->palette)
@ -453,7 +457,8 @@ gst_ffmpegcsp_transform (GstBaseTransform * btrans, GstBuffer * inbuf,
/* fill target frame */ /* fill target frame */
gst_ffmpegcsp_avpicture_fill (&space->to_frame, gst_ffmpegcsp_avpicture_fill (&space->to_frame,
GST_BUFFER_DATA (outbuf), space->to_pixfmt, space->width, space->height); GST_BUFFER_DATA (outbuf), space->to_pixfmt, space->width, space->height,
space->interlaced);
/* and convert */ /* and convert */
result = img_convert (&space->to_frame, space->to_pixfmt, result = img_convert (&space->to_frame, space->to_pixfmt,

View file

@ -46,6 +46,7 @@ struct _GstFFMpegCsp {
GstBaseTransform element; GstBaseTransform element;
gint width, height; gint width, height;
gboolean interlaced;
gfloat fps; gfloat fps;
enum PixelFormat from_pixfmt, to_pixfmt; enum PixelFormat from_pixfmt, to_pixfmt;
AVPicture from_frame, to_frame; AVPicture from_frame, to_frame;

View file

@ -565,7 +565,7 @@ avpicture_get_size (int pix_fmt, int width, int height)
AVPicture dummy_pict; AVPicture dummy_pict;
return gst_ffmpegcsp_avpicture_fill (&dummy_pict, NULL, pix_fmt, width, return gst_ffmpegcsp_avpicture_fill (&dummy_pict, NULL, pix_fmt, width,
height); height, FALSE);
} }
/** /**
@ -2908,7 +2908,8 @@ get_convert_table_entry (int src_pix_fmt, int dst_pix_fmt)
} }
static int static int
avpicture_alloc (AVPicture * picture, int pix_fmt, int width, int height) avpicture_alloc (AVPicture * picture, int pix_fmt, int width, int height,
int interlaced)
{ {
unsigned int size; unsigned int size;
void *ptr; void *ptr;
@ -2917,7 +2918,8 @@ avpicture_alloc (AVPicture * picture, int pix_fmt, int width, int height)
ptr = av_malloc (size); ptr = av_malloc (size);
if (!ptr) if (!ptr)
goto fail; goto fail;
gst_ffmpegcsp_avpicture_fill (picture, ptr, pix_fmt, width, height); gst_ffmpegcsp_avpicture_fill (picture, ptr, pix_fmt, width, height,
interlaced);
return 0; return 0;
fail: fail:
memset (picture, 0, sizeof (AVPicture)); memset (picture, 0, sizeof (AVPicture));
@ -3159,7 +3161,8 @@ no_chroma_filter:
else else
int_pix_fmt = PIX_FMT_RGB24; int_pix_fmt = PIX_FMT_RGB24;
} }
if (avpicture_alloc (tmp, int_pix_fmt, dst_width, dst_height) < 0) if (avpicture_alloc (tmp, int_pix_fmt, dst_width, dst_height,
dst->interlaced) < 0)
return -1; return -1;
ret = -1; ret = -1;
if (img_convert (tmp, int_pix_fmt, if (img_convert (tmp, int_pix_fmt,