[Sumover-dev] [svn commit] r3806 - vic/trunk/codec

Colin Perkins csp at csperkins.org
Fri Sep 22 16:04:32 BST 2006


I tried to test this with UltraGrid, but couldn't get vic to display  
anything. Has anyone had any luck with dv decoding?

Colin



On 6 Sep 2006, at 03:38, sumover-dev at cs.ucl.ac.uk wrote:

> Author: rhys
> Date: Wed Sep  6 03:38:03 2006
> New Revision: 3806
>
> Modified:
>    vic/trunk/codec/decoder-dv.cpp
>
> Log:
>
> Fixed problems with dv decoder. Now can get image in VIC although
> packet loss is too high for it to be any use.
>
>
>
> Modified: vic/trunk/codec/decoder-dv.cpp
> ====================================================================== 
> ========
> --- vic/trunk/codec/decoder-dv.cpp	(original)
> +++ vic/trunk/codec/decoder-dv.cpp	Wed Sep  6 03:38:03 2006
> @@ -11,6 +11,22 @@
>
>  #include <libdv/dv.h>
>
> +/*
> + * libdv does either yv12 or yuyv and this is determined at
> + * libdv's compile time. There is no way programatically to
> + * check this, so we use the following #define depending on
> + * how libdv is compiled. A segfault is likely if libdv
> + * produces yuy2 and this code assumes yv12 and visa-versa.
> + */
> +
> +#define ASSUME_YUY2 1
> +#if ASSUME_YUY2 == 1
> +static void yuy2_to_i420(const u_char *in,
> +			 u_int width,
> +			 u_int height,
> +			 u_char *out);
> +#endif // ASSUME_YUY2
> +
>  class DVDecoder : public Decoder {
>      public:
>  	DVDecoder();
> @@ -28,6 +44,10 @@
>
>          u_char *dv_frame;
>
> +#if ASSUME_YUY2 == 1
> +	u_char *dv_yuy2_frame;
> +#endif
> +
>          bool header_received;
>          bool headers_received[12];
>          bool vaux_received[12];
> @@ -61,6 +81,9 @@
>  			 dv_decoder(0),
>  			 dv_buffer(new u_char[144000]),
>  			 dv_frame(new u_char[(DV_WIDTH * DV_PAL_HEIGHT * 3)/2]),
> +#if ASSUME_YUY2 == 1
> +			 dv_yuy2_frame(new u_char[DV_WIDTH * DV_PAL_HEIGHT * 2]),
> +#endif
>  			 header_received(false),
>  			 difblocks(0)
>  {
> @@ -72,12 +95,6 @@
>  	stat_[STAT_BAD_HEADER].name = "H261-Bad-Header";
>  	nstat_ = 6;
>
> -	/*
> -         * libdv does either yv12 or yuyv and this is determined at
> -	 * libdv's compile time. There is no way programatically to
> -	 * check this, so the default of yv12 is assumed. yv12 is the
> -	 * same as i420 but with the u and v planes swapped.
> -	 */
>  	decimation_ = 411;
>
>  	/*
> @@ -100,6 +117,9 @@
>
>  	memset(dv_buffer, 0, 144000);
>  	memset(dv_frame, 127, (DV_WIDTH * DV_PAL_HEIGHT * 3)/2);
> +#if ASSUME_YUY2 == 1
> +	memset(dv_yuy2_frame, 127, DV_WIDTH * DV_PAL_HEIGHT * 2);
> +#endif
>  }
>
>  DVDecoder::~DVDecoder()
> @@ -217,6 +237,29 @@
>  				        break;
>  				}
>
> +#if ASSUME_YUY2 == 1
> +				unsigned char *pixels[3];
> +				int pitches[3];
> +
> +				pixels[0] = dv_yuy2_frame;
> +				pixels[1] = 0;
> +				pixels[2] = 0;
> +
> +				pitches[0] = inw_*2;
> +				pitches[1] = 0;
> +				pitches[2] = 0;
> +
> + 				dv_decode_full_frame(dv_decoder,
> + 						     (const uint8_t*)dv_buffer,
> + 						     e_dv_color_yuv,
> + 						     pixels,
> + 						     pitches);
> +
> +				yuy2_to_i420(dv_yuy2_frame,
> +					     inw_,
> +					     inh_,
> +					     dv_frame);
> +#else				
>  				unsigned char *pixels[3];
>  				int pitches[3];
>
> @@ -225,11 +268,17 @@
>  				pixels[1] = dv_frame + (inh_ * inw_ * 5)/4;
>  				pixels[2] = dv_frame + (inh_ * inw_);
>
> -				dv_decode_full_frame(dv_decoder,
> -						     (const uint8_t*)dv_buffer,
> -						     e_dv_color_yuv,
> -						     pixels,
> -						     pitches);
> +				pitches[0] = inw_;
> +				pitches[1] = inw_/2;
> +				pitches[2] = inw_/2;
> +
> +				printf("decoding yv12\n");
> +// 				dv_decode_full_frame(dv_decoder,
> +// 						     (const uint8_t*)dv_buffer,
> +// 						     e_dv_color_yuv,
> +// 						     pixels,
> +// 						     pitches);
> +#endif // ASSUME_YUY2
>  				
>  				render_frame(dv_frame);
>  			}
> @@ -244,4 +293,49 @@
>          Decoder::redraw(dv_frame);
>  }
>
> +static void yuy2_to_i420(const u_char *in,
> +			 u_int width,
> +			 u_int height,
> +			 u_char *out)
> +{
> +  const u_char *_in[2];
> +  u_int in_rowstride = width * 2;
> +
> +
> +  u_char *out_y[2];
> +  u_char *out_u;
> +  u_char *out_v;
> +
> +  u_int half_width = width/2;
> +  u_int half_height = height/2;
> +
> +  _in[0] = in;
> +  _in[1] = in + in_rowstride;
> +
> +  out_y[0] = out;
> +  out_y[1] = out + width;
> +  out_u = out + width * height;
> +  out_v = out + (width * height * 5)/4;
> +
> +  for (u_int j = 0; j < half_height; j ++) {
> +    for (u_int i = 0; i < half_width; i ++, _in[0] += 4, _in[1] +=  
> 4, out_y[0] += 2, out_y[1] += 2, out_u ++, out_v ++) {
> +
> +      out_y[0][0] = _in[0][0];
> +      out_y[0][1] = _in[0][2];
> +
> +      out_y[1][0] = _in[1][0];
> +      out_y[1][1] = _in[1][2];
> +
> +      *out_u = _in[0][1];
> +      *out_v = _in[0][3];
> +    }
> +     _in[0] += in_rowstride;
> +     _in[1] += in_rowstride;
> +
> +     out_y[0] += width;
> +     out_y[1] += width;
> +  }
> +}
> +
>  #endif // USE_DVDECODER
> +
>
> _______________________________________________
> Sumover-dev mailing list
> Sumover-dev at cs.ucl.ac.uk
> http://oakham.cs.ucl.ac.uk/mailman/listinfo/sumover-dev




More information about the Sumover-dev mailing list