Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 20 Dec 2011 00:54:41 +0000 (01:54 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 20 Dec 2011 03:12:09 +0000 (04:12 +0100)
* qatar/master:
  h264: clear trailing bits in partially parsed NAL units
  vc1: Handle WVC1 interlaced stream
  xl: Fix overreads
  mpegts: rename payload_index to payload_size
  segment: introduce segmented chain muxer
  lavu: add AVERROR_BUG error value
  avplay: clear pkt_temp when pkt is freed.
  qcelpdec: K&R formatting cosmetics
  qcelpdec: cosmetics: drop some pointless parentheses
  x86: conditionally compile dnxhd encoder optimizations
  Revert "h264: skip start code search if the size of the nal unit is known"
  swscale: fix formatting and indentation of unscaled conversion routines.
  h264: skip start code search if the size of the nal unit is known
  cljr: fix buf_size sanity check
  cljr: Check if width and height are positive integers

Conflicts:
libavcodec/cljr.c
libavcodec/vc1dec.c
libavformat/Makefile
libavformat/mpegtsenc.c
libavformat/segment.c
libswscale/swscale_unscaled.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
12 files changed:
1  2 
Changelog
doc/muxers.texi
libavcodec/h264.c
libavcodec/qcelpdec.c
libavcodec/vc1dec.c
libavcodec/x86/Makefile
libavcodec/xl.c
libavformat/Makefile
libavformat/mpegtsenc.c
libavutil/error.c
libavutil/error.h
libswscale/swscale_unscaled.c

diff --cc Changelog
+++ b/Changelog
@@@ -122,27 -102,42 +122,28 @@@ easier to use. The changes are
  - Discworld II BMV decoding support
  - VBLE Decoder
  - OS X Video Decoder Acceleration (VDA) support
 +- compact and csv output in ffprobe
 +- pan audio filter
 +- IFF Amiga Continuous Bitmap (ACBM) decoder
 +- ass filter
  - CRI ADX audio format demuxer
  - Playstation Portable PMP format demuxer
 +- Microsoft Windows ICO demuxer
 +- life source
  - PCM format support in OMA demuxer
  - CLJR encoder
 +- new option: -report
  - Dxtory capture format decoder
 -- v410 QuickTime uncompressed 4:4:4 10-bit encoder and decoder
 +- cellauto source
 +- v410 Quicktime Uncompressed 4:4:4 10-bit encoder and decoder
 +- SBaGen (SBG) binaural beats script demuxer
  - OpenMG Audio muxer
+ - Simple segmenting muxer
  
  
 -version 0.7:
 -
 -- E-AC-3 audio encoder
 -- ac3enc: add channel coupling support
 -- floating-point sample format support for (E-)AC-3, DCA, AAC, Vorbis decoders
 -- H.264/MPEG frame-level multithreading
 -- av_metadata_* functions renamed to av_dict_* and moved to libavutil
 -- 4:4:4 H.264 decoding support
 -- 10-bit H.264 optimizations for x86
 -- bump libswscale for recently reported ABI break
 -
 -
 -version 0.7_beta2:
 -
 -- VP8 frame-level multithreading
 -- NEON optimizations for VP8
 -- removed a lot of deprecated API cruft
 -- FFT and IMDCT optimizations for AVX (Sandy Bridge) processors
 -- DPX image encoder
 -- SMPTE 302M AES3 audio decoder
 -- ffmpeg no longer quits after the 'q' key is pressed; use 'ctrl+c' instead
 -- 9bit and 10bit per sample support in the H.264 decoder
 -
 -
 -version 0.7_beta1:
 +version 0.8:
  
 +- many many things we forgot because we rather write code than changelogs
  - WebM support in Matroska de/muxer
  - low overhead Ogg muxing
  - MMS-TCP support
diff --cc doc/muxers.texi
@@@ -282,7 -265,38 +283,38 @@@ Both eyes laced in one Block, Right-ey
  
  For example a 3D WebM clip can be created using the following command line:
  @example
 -avconv -i sample_left_right_clip.mpg -an -c:v libvpx -metadata STEREO_MODE=left_right -y stereo_clip.webm
 +ffmpeg -i sample_left_right_clip.mpg -an -c:v libvpx -metadata stereo_mode=left_right -y stereo_clip.webm
  @end example
  
 -avconv -i in.mkv -c copy -map 0 -f segment -list out.list out%03d.nut
+ @section segment
+ Basic stream segmenter.
+ The segmenter muxer outputs streams to a number of separate files of nearly
+ fixed duration. Output filename pattern can be set in a fashion similar to
+ @ref{image2}.
+ Every segment starts with a video keyframe, if a video stream is present.
+ The segment muxer works best with a single constant frame rate video.
+ Optionally it can generate a flat list of the created segments, one segment
+ per line.
+ @table @option
+ @item segment_format @var{format}
+ Override the inner container format, by default it is guessed by the filename
+ extension.
+ @item segment_time @var{t}
+ Set segment duration to @var{t} seconds.
+ @item segment_list @var{name}
+ Generate also a listfile named @var{name}.
+ @item segment_list_size @var{size}
+ Overwrite the listfile once it reaches @var{size} entries.
+ @end table
+ @example
++ffmpeg -i in.mkv -c copy -map 0 -f segment -list out.list out%03d.nut
+ @end example
  @c man end MUXERS
Simple merge
Simple merge
@@@ -508,7 -508,7 +508,7 @@@ static void vc1_mc_1mv(VC1Context *v, i
      }
      if (v->field_mode) { // interlaced field picture
          if (!dir) {
--            if ((v->cur_field_type != v->ref_field_type[dir]) && v->cur_field_type) {
++            if ((v->cur_field_type != v->ref_field_type[dir]) && v->second_field) {
                  srcY = s->current_picture.f.data[0];
                  srcU = s->current_picture.f.data[1];
                  srcV = s->current_picture.f.data[2];
          srcY += s->mspel * (1 + s->linesize);
      }
  
--    if (v->field_mode && v->cur_field_type) {
++    if (v->field_mode && v->second_field) {
          off    = s->current_picture_ptr->f.linesize[0];
          off_uv = s->current_picture_ptr->f.linesize[1];
      } else {
@@@ -697,7 -697,7 +697,7 @@@ static void vc1_mc_4mv_luma(VC1Context 
  
      if (!dir) {
          if (v->field_mode) {
--            if ((v->cur_field_type != v->ref_field_type[dir]) && v->cur_field_type)
++            if ((v->cur_field_type != v->ref_field_type[dir]) && v->second_field)
                  srcY = s->current_picture.f.data[0];
              else
                  srcY = s->last_picture.f.data[0];
          off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8;
      else
          off = s->linesize * 4 * (n & 2) + (n & 1) * 8;
--    if (v->field_mode && v->cur_field_type)
++    if (v->field_mode && v->second_field)
          off += s->current_picture_ptr->f.linesize[0];
  
      src_x = s->mb_x * 16 + (n & 1) * 8 + (mx >> 2);
@@@ -994,7 -994,7 +994,7 @@@ static void vc1_mc_4mv_chroma(VC1Contex
              srcU += s->current_picture_ptr->f.linesize[1];
              srcV += s->current_picture_ptr->f.linesize[2];
          }
--        off = v->cur_field_type ? s->current_picture_ptr->f.linesize[1] : 0;
++        off = v->second_field ? s->current_picture_ptr->f.linesize[1] : 0;
      }
  
      if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
@@@ -2048,7 -2048,7 +2048,7 @@@ static void vc1_interp_mc(VC1Context *v
          srcY += s->mspel * (1 + s->linesize);
      }
  
--    if (v->field_mode && v->cur_field_type) {
++    if (v->field_mode && v->second_field) {
          off    = s->current_picture_ptr->f.linesize[0];
          off_uv = s->current_picture_ptr->f.linesize[1];
      } else {
@@@ -4055,7 -4055,7 +4055,7 @@@ static int vc1_decode_p_mb_intfi(VC1Con
                  continue;
              v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
              off  = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
--            off += v->cur_field_type ? ((i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0]) : 0;
++            off += v->second_field ? ((i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0]) : 0;
              s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
              // TODO: loop filter
          }
              dst_idx += i >> 2;
              val = ((cbp >> (5 - i)) & 1);
              off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
--            if (v->cur_field_type)
++            if (v->second_field)
                  off += (i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0];
              if (val) {
                  pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
@@@ -4332,7 -4332,7 +4332,7 @@@ static void vc1_decode_b_mb_intfi(VC1Co
                  for (j = 0; j < 64; j++)
                      s->block[i][j] <<= 1;
              off  = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
--            off += v->cur_field_type ? ((i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0]) : 0;
++            off += v->second_field ? ((i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0]) : 0;
              s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
              // TODO: yet to perform loop filter
          }
              dst_idx += i >> 2;
              val = ((cbp >> (5 - i)) & 1);
              off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
--            if (v->cur_field_type)
++            if (v->second_field)
                  off += (i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0];
              if (val) {
                  vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
@@@ -5425,9 -5425,9 +5425,9 @@@ static int vc1_decode_frame(AVCodecCont
      MpegEncContext *s = &v->s;
      AVFrame *pict = data;
      uint8_t *buf2 = NULL;
-     uint8_t *buf_field2 = NULL;
      const uint8_t *buf_start = buf;
 -    int mb_height, n_slices1;
+     uint8_t *tmp;
 +    int mb_height, n_slices1=-1;
      struct {
          uint8_t *buf;
          GetBitContext gb;
@@@ -35,9 -31,8 +35,10 @@@ YASM-OBJS-$(CONFIG_DIRAC_DECODER)      
  MMX-OBJS-$(CONFIG_AC3DSP)              += x86/ac3dsp_mmx.o
  YASM-OBJS-$(CONFIG_AC3DSP)             += x86/ac3dsp.o
  MMX-OBJS-$(CONFIG_CAVS_DECODER)        += x86/cavsdsp_mmx.o
+ MMX-OBJS-$(CONFIG_DNXHD_ENCODER)       += x86/dnxhd_mmx.o
  MMX-OBJS-$(CONFIG_MPEGAUDIODSP)        += x86/mpegaudiodec_mmx.o
 +YASM-OBJS-$(CONFIG_MPEGAUDIODSP)       += x86/imdct36_sse.o
 +MMX-OBJS-$(CONFIG_PNG_DECODER)         += x86/png_mmx.o
  MMX-OBJS-$(CONFIG_ENCODERS)            += x86/dsputilenc_mmx.o
  YASM-OBJS-$(CONFIG_ENCODERS)           += x86/dsputilenc_yasm.o
  MMX-OBJS-$(CONFIG_GPL)                 += x86/idct_mmx.o
diff --cc libavcodec/xl.c
Simple merge
@@@ -282,10 -266,9 +282,10 @@@ OBJS-$(CONFIG_RTSP_MUXER
                                              rtpenc_chain.o
  OBJS-$(CONFIG_SAP_DEMUXER)               += sapdec.o
  OBJS-$(CONFIG_SAP_MUXER)                 += sapenc.o rtpenc_chain.o
 +OBJS-$(CONFIG_SBG_DEMUXER)               += sbgdec.o
  OBJS-$(CONFIG_SDP_DEMUXER)               += rtsp.o
  OBJS-$(CONFIG_SEGAFILM_DEMUXER)          += segafilm.o
- OBJS-$(CONFIG_SEGMENT_MUXER)                   += segment.o
+ OBJS-$(CONFIG_SEGMENT_MUXER)             += segment.o
  OBJS-$(CONFIG_SHORTEN_DEMUXER)           += rawdec.o
  OBJS-$(CONFIG_SIFF_DEMUXER)              += siff.o
  OBJS-$(CONFIG_SMACKER_DEMUXER)           += smacker.o
@@@ -1034,22 -999,21 +1034,22 @@@ static int mpegts_write_packet(AVFormat
          }
      }
  
-     if (ts_st->payload_index && ts_st->payload_index + size > DEFAULT_PES_PAYLOAD_SIZE) {
-         mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
 -    if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
 -        // for video and subtitle, write a single pes packet
 -        mpegts_write_pes(s, st, buf, size, pts, dts, pkt->flags & AV_PKT_FLAG_KEY);
 -        av_free(data);
 -        return 0;
 -    }
 -
 -    if (ts_st->payload_size + size > DEFAULT_PES_PAYLOAD_SIZE) {
++    if (ts_st->payload_size && ts_st->payload_size + size > DEFAULT_PES_PAYLOAD_SIZE) {
+         mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
                           ts_st->payload_pts, ts_st->payload_dts,
                           ts_st->payload_flags & AV_PKT_FLAG_KEY);
-         ts_st->payload_index = 0;
+         ts_st->payload_size = 0;
      }
  
-         av_assert0(!ts_st->payload_index);
 +    if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO || size > DEFAULT_PES_PAYLOAD_SIZE) {
-     if (!ts_st->payload_index) {
++        av_assert0(!ts_st->payload_size);
 +        // for video and subtitle, write a single pes packet
 +        mpegts_write_pes(s, st, buf, size, pts, dts, pkt->flags & AV_PKT_FLAG_KEY);
 +        av_free(data);
 +        return 0;
 +    }
 +
+     if (!ts_st->payload_size) {
          ts_st->payload_pts = pts;
          ts_st->payload_dts = dts;
          ts_st->payload_flags = pkt->flags;
@@@ -27,7 -26,6 +27,8 @@@ int av_strerror(int errnum, char *errbu
  
      switch (errnum) {
      case AVERROR_BSF_NOT_FOUND:     errstr = "Bitstream filter not found"                   ; break;
++    case AVERROR_BUG2:
 +    case AVERROR_BUG:               errstr = "Internal bug, should not have happened"       ; break;
      case AVERROR_DECODER_NOT_FOUND: errstr = "Decoder not found"                            ; break;
      case AVERROR_DEMUXER_NOT_FOUND: errstr = "Demuxer not found"                            ; break;
      case AVERROR_ENCODER_NOT_FOUND: errstr = "Encoder not found"                            ; break;
@@@ -45,7 -45,6 +45,7 @@@
  #endif
  
  #define AVERROR_BSF_NOT_FOUND      (-MKTAG(0xF8,'B','S','F')) ///< Bitstream filter not found
- #define AVERROR_BUG                (-MKTAG( 'B','U','G','!')) ///< Internal bug
++#define AVERROR_BUG                (-MKTAG( 'B','U','G','!')) ///< Internal bug, also see AVERROR_BUG2
  #define AVERROR_DECODER_NOT_FOUND  (-MKTAG(0xF8,'D','E','C')) ///< Decoder not found
  #define AVERROR_DEMUXER_NOT_FOUND  (-MKTAG(0xF8,'D','E','M')) ///< Demuxer not found
  #define AVERROR_ENCODER_NOT_FOUND  (-MKTAG(0xF8,'E','N','C')) ///< Encoder not found
  #define AVERROR_INVALIDDATA        (-MKTAG( 'I','N','D','A')) ///< Invalid data found when processing input
  #define AVERROR_MUXER_NOT_FOUND    (-MKTAG(0xF8,'M','U','X')) ///< Muxer not found
  #define AVERROR_OPTION_NOT_FOUND   (-MKTAG(0xF8,'O','P','T')) ///< Option not found
 -#define AVERROR_PATCHWELCOME       (-MKTAG( 'P','A','W','E')) ///< Not yet implemented in Libav, patches welcome
 +#define AVERROR_PATCHWELCOME       (-MKTAG( 'P','A','W','E')) ///< Not yet implemented in FFmpeg, patches welcome
  #define AVERROR_PROTOCOL_NOT_FOUND (-MKTAG(0xF8,'P','R','O')) ///< Protocol not found
  #define AVERROR_STREAM_NOT_FOUND   (-MKTAG(0xF8,'S','T','R')) ///< Stream not found
 -#define AVERROR_BUG                (-MKTAG( 'B','U','G',' ')) ///< Bug detected, please report the issue
 +
 +/**
++ * This is semantically identical to AVERROR_BUG
++ * it has been introduced in Libav after our AVERROR_BUG and with a modified value.
++ */
++#define AVERROR_BUG2               (-MKTAG( 'B','U','G',' '))
+ /**
   * Put a description of the AVERROR code errnum in errbuf.
   * In case of failure the global variable errno is set to indicate the
   * error. Even in case of failure av_strerror() will print a generic
  #include "libavutil/bswap.h"
  #include "libavutil/pixdesc.h"
  
 -DECLARE_ALIGNED(8, const uint8_t, dither_8x8_1)[8][8] = {
 -    {   0,  1,  0,  1,  0,  1,  0,  1,},
 -    {   1,  0,  1,  0,  1,  0,  1,  0,},
 -    {   0,  1,  0,  1,  0,  1,  0,  1,},
 -    {   1,  0,  1,  0,  1,  0,  1,  0,},
 -    {   0,  1,  0,  1,  0,  1,  0,  1,},
 -    {   1,  0,  1,  0,  1,  0,  1,  0,},
 -    {   0,  1,  0,  1,  0,  1,  0,  1,},
 -    {   1,  0,  1,  0,  1,  0,  1,  0,},
 -};
 -DECLARE_ALIGNED(8, const uint8_t, dither_8x8_3)[8][8] = {
 -    {   1,  2,  1,  2,  1,  2,  1,  2,},
 -    {   3,  0,  3,  0,  3,  0,  3,  0,},
 -    {   1,  2,  1,  2,  1,  2,  1,  2,},
 -    {   3,  0,  3,  0,  3,  0,  3,  0,},
 -    {   1,  2,  1,  2,  1,  2,  1,  2,},
 -    {   3,  0,  3,  0,  3,  0,  3,  0,},
 -    {   1,  2,  1,  2,  1,  2,  1,  2,},
 -    {   3,  0,  3,  0,  3,  0,  3,  0,},
 -};
 -DECLARE_ALIGNED(8, const uint8_t, dither_8x8_64)[8][8] = {
 -    {  18, 34, 30, 46, 17, 33, 29, 45,},
 -    {  50,  2, 62, 14, 49,  1, 61, 13,},
 -    {  26, 42, 22, 38, 25, 41, 21, 37,},
 -    {  58, 10, 54,  6, 57,  9, 53,  5,},
 -    {  16, 32, 28, 44, 19, 35, 31, 47,},
 -    {  48,  0, 60, 12, 51,  3, 63, 15,},
 -    {  24, 40, 20, 36, 27, 43, 23, 39,},
 -    {  56,  8, 52,  4, 59, 11, 55,  7,},
 -};
 -extern const uint8_t dither_8x8_128[8][8];
 -DECLARE_ALIGNED(8, const uint8_t, dither_8x8_256)[8][8] = {
 -    {  72, 136, 120, 184,  68, 132, 116, 180,},
 -    { 200,   8, 248,  56, 196,   4, 244,  52,},
 -    { 104, 168,  88, 152, 100, 164,  84, 148,},
 -    { 232,  40, 216,  24, 228,  36, 212,  20,},
 -    {  64, 128, 102, 176,  76, 140, 124, 188,},
 -    { 192,   0, 240,  48, 204,  12, 252,  60,},
 -    {  96, 160,  80, 144, 108, 172,  92, 156,},
 -    { 224,  32, 208,  16, 236,  44, 220,  28,},
 -};
 -
  #define RGB2YUV_SHIFT 15
- #define BY ( (int)(0.114*219/255*(1<<RGB2YUV_SHIFT)+0.5))
- #define BV (-(int)(0.081*224/255*(1<<RGB2YUV_SHIFT)+0.5))
- #define BU ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5))
- #define GY ( (int)(0.587*219/255*(1<<RGB2YUV_SHIFT)+0.5))
- #define GV (-(int)(0.419*224/255*(1<<RGB2YUV_SHIFT)+0.5))
- #define GU (-(int)(0.331*224/255*(1<<RGB2YUV_SHIFT)+0.5))
- #define RY ( (int)(0.299*219/255*(1<<RGB2YUV_SHIFT)+0.5))
- #define RV ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5))
- #define RU (-(int)(0.169*224/255*(1<<RGB2YUV_SHIFT)+0.5))
- static void fillPlane(uint8_t* plane, int stride, int width, int height, int y, uint8_t val)
+ #define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
+ #define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
+ #define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
+ #define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
+ #define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
+ #define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
+ #define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
+ #define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
+ #define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
+ static void fillPlane(uint8_t *plane, int stride, int width, int height, int y,
+                       uint8_t val)
  {
      int i;
-     uint8_t *ptr = plane + stride*y;
-     for (i=0; i<height; i++) {
+     uint8_t *ptr = plane + stride * y;
+     for (i = 0; i < height; i++) {
          memset(ptr, val, width);
          ptr += stride;
      }
@@@ -231,18 -297,19 +255,19 @@@ static int packed_16bpc_bswap(SwsContex
      return srcSliceH;
  }
  
- static int palToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
-                            int srcSliceH, uint8_t* dst[], int dstStride[])
+ static int palToRgbWrapper(SwsContext *c, const uint8_t *src[], int srcStride[],
+                            int srcSliceY, int srcSliceH, uint8_t *dst[],
+                            int dstStride[])
  {
-     const enum PixelFormat srcFormat= c->srcFormat;
-     const enum PixelFormat dstFormat= c->dstFormat;
+     const enum PixelFormat srcFormat = c->srcFormat;
+     const enum PixelFormat dstFormat = c->dstFormat;
      void (*conv)(const uint8_t *src, uint8_t *dst, int num_pixels,
-                  const uint8_t *palette)=NULL;
+                  const uint8_t *palette) = NULL;
      int i;
-     uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY;
-     const uint8_t *srcPtr= src[0];
+     uint8_t *dstPtr = dst[0] + dstStride[0] * srcSliceY;
+     const uint8_t *srcPtr = src[0];
  
 -    if (srcFormat == PIX_FMT_Y400A) {
 +    if (srcFormat == PIX_FMT_GRAY8A) {
          switch (dstFormat) {
          case PIX_FMT_RGB32  : conv = gray8aToPacked32; break;
          case PIX_FMT_BGR32  : conv = gray8aToPacked32; break;
  
      if (!conv)
          av_log(c, AV_LOG_ERROR, "internal error %s -> %s converter\n",
 -               sws_format_name(srcFormat), sws_format_name(dstFormat));
 +               av_get_pix_fmt_name(srcFormat), av_get_pix_fmt_name(dstFormat));
      else {
-         for (i=0; i<srcSliceH; i++) {
+         for (i = 0; i < srcSliceH; i++) {
              conv(srcPtr, dstPtr, c->srcW, (uint8_t *) c->pal_rgb);
-             srcPtr+= srcStride[0];
-             dstPtr+= dstStride[0];
+             srcPtr += srcStride[0];
+             dstPtr += dstStride[0];
          }
      }
  
@@@ -437,26 -419,30 +463,30 @@@ static int rgbToRgbWrapper(SwsContext *
  
      if (!conv) {
          av_log(c, AV_LOG_ERROR, "internal error %s -> %s converter\n",
 -               sws_format_name(srcFormat), sws_format_name(dstFormat));
 +               av_get_pix_fmt_name(srcFormat), av_get_pix_fmt_name(dstFormat));
      } else {
-         const uint8_t *srcPtr= src[0];
-               uint8_t *dstPtr= dst[0];
-         if ((srcFormat == PIX_FMT_RGB32_1 || srcFormat == PIX_FMT_BGR32_1) && !isRGBA32(dstFormat))
+         const uint8_t *srcPtr = src[0];
+               uint8_t *dstPtr = dst[0];
+         if ((srcFormat == PIX_FMT_RGB32_1 || srcFormat == PIX_FMT_BGR32_1) &&
+             !isRGBA32(dstFormat))
              srcPtr += ALT32_CORR;
  
-         if ((dstFormat == PIX_FMT_RGB32_1 || dstFormat == PIX_FMT_BGR32_1) && !isRGBA32(srcFormat))
+         if ((dstFormat == PIX_FMT_RGB32_1 || dstFormat == PIX_FMT_BGR32_1) &&
+             !isRGBA32(srcFormat))
              dstPtr += ALT32_CORR;
  
-         if (dstStride[0]*srcBpp == srcStride[0]*dstBpp && srcStride[0] > 0 && !(srcStride[0] % srcBpp))
-             conv(srcPtr, dstPtr + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]);
+         if (dstStride[0] * srcBpp == srcStride[0] * dstBpp && srcStride[0] > 0 &&
+             !(srcStride[0] % srcBpp))
+             conv(srcPtr, dstPtr + dstStride[0] * srcSliceY,
+                  srcSliceH * srcStride[0]);
          else {
              int i;
-             dstPtr += dstStride[0]*srcSliceY;
+             dstPtr += dstStride[0] * srcSliceY;
  
-             for (i=0; i<srcSliceH; i++) {
-                 conv(srcPtr, dstPtr, c->srcW*srcBpp);
-                 srcPtr+= srcStride[0];
-                 dstPtr+= dstStride[0];
+             for (i = 0; i < srcSliceH; i++) {
+                 conv(srcPtr, dstPtr, c->srcW * srcBpp);
+                 srcPtr += srcStride[0];
+                 dstPtr += dstStride[0];
              }
          }
      }
@@@ -519,135 -509,203 +553,137 @@@ static int packedCopyWrapper(SwsContex
      return srcSliceH;
  }
  
 -#define clip9(x)  av_clip_uintp2(x,  9)
 -#define clip10(x) av_clip_uintp2(x, 10)
 -#define DITHER_COPY(dst, dstStride, wfunc, src, srcStride, rfunc, dithers, shift, clip) \
 -    for (i = 0; i < height; i++) { \
 -        const uint8_t *dither = dithers[i & 7]; \
 -        for (j = 0; j < length - 7; j += 8) { \
 -            wfunc(&dst[j + 0], clip((rfunc(&src[j + 0]) + dither[0]) >> shift)); \
 -            wfunc(&dst[j + 1], clip((rfunc(&src[j + 1]) + dither[1]) >> shift)); \
 -            wfunc(&dst[j + 2], clip((rfunc(&src[j + 2]) + dither[2]) >> shift)); \
 -            wfunc(&dst[j + 3], clip((rfunc(&src[j + 3]) + dither[3]) >> shift)); \
 -            wfunc(&dst[j + 4], clip((rfunc(&src[j + 4]) + dither[4]) >> shift)); \
 -            wfunc(&dst[j + 5], clip((rfunc(&src[j + 5]) + dither[5]) >> shift)); \
 -            wfunc(&dst[j + 6], clip((rfunc(&src[j + 6]) + dither[6]) >> shift)); \
 -            wfunc(&dst[j + 7], clip((rfunc(&src[j + 7]) + dither[7]) >> shift)); \
 -        } \
 -        for (; j < length; j++) \
 -            wfunc(&dst[j],     (rfunc(&src[j]) + dither[j & 7]) >> shift); \
 -        dst += dstStride; \
 -        src += srcStride; \
 +#define DITHER_COPY(dst, dstStride, src, srcStride, bswap, dbswap)\
 +    uint16_t scale= dither_scale[dst_depth-1][src_depth-1];\
 +    int shift= src_depth-dst_depth + dither_scale[src_depth-2][dst_depth-1];\
 +    for (i = 0; i < height; i++) {\
 +        const uint8_t *dither= dithers[src_depth-9][i&7];\
 +        for (j = 0; j < length-7; j+=8){\
 +            dst[j+0] = dbswap((bswap(src[j+0]) + dither[0])*scale>>shift);\
 +            dst[j+1] = dbswap((bswap(src[j+1]) + dither[1])*scale>>shift);\
 +            dst[j+2] = dbswap((bswap(src[j+2]) + dither[2])*scale>>shift);\
 +            dst[j+3] = dbswap((bswap(src[j+3]) + dither[3])*scale>>shift);\
 +            dst[j+4] = dbswap((bswap(src[j+4]) + dither[4])*scale>>shift);\
 +            dst[j+5] = dbswap((bswap(src[j+5]) + dither[5])*scale>>shift);\
 +            dst[j+6] = dbswap((bswap(src[j+6]) + dither[6])*scale>>shift);\
 +            dst[j+7] = dbswap((bswap(src[j+7]) + dither[7])*scale>>shift);\
 +        }\
 +        for (; j < length; j++)\
 +            dst[j] = dbswap((bswap(src[j]) + dither[j&7])*scale>>shift);\
 +        dst += dstStride;\
 +        src += srcStride;\
      }
  
static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
-                              int srcSliceH, uint8_t* dst[], int dstStride[])
+ static int planarCopyWrapper(SwsContext *c, const uint8_t *src[],
                             int srcStride[], int srcSliceY, int srcSliceH,
+                              uint8_t *dst[], int dstStride[])
  {
      int plane, i, j;
-     for (plane=0; plane<4; plane++) {
-         int length= (plane==0 || plane==3) ? c->srcW  : -((-c->srcW  )>>c->chrDstHSubSample);
-         int y=      (plane==0 || plane==3) ? srcSliceY: -((-srcSliceY)>>c->chrDstVSubSample);
-         int height= (plane==0 || plane==3) ? srcSliceH: -((-srcSliceH)>>c->chrDstVSubSample);
-         const uint8_t *srcPtr= src[plane];
-         uint8_t *dstPtr= dst[plane] + dstStride[plane]*y;
+     for (plane = 0; plane < 4; plane++) {
+         int length = (plane == 0 || plane == 3) ? c->srcW  : -((-c->srcW  ) >> c->chrDstHSubSample);
+         int y =      (plane == 0 || plane == 3) ? srcSliceY: -((-srcSliceY) >> c->chrDstVSubSample);
+         int height = (plane == 0 || plane == 3) ? srcSliceH: -((-srcSliceH) >> c->chrDstVSubSample);
+         const uint8_t *srcPtr = src[plane];
+         uint8_t *dstPtr = dst[plane] + dstStride[plane] * y;
 +        int shiftonly= plane==1 || plane==2 || (!c->srcRange && plane==0);
  
-         if (!dst[plane]) continue;
+         if (!dst[plane])
+             continue;
          // ignore palette for GRAY8
          if (plane == 1 && !dst[2]) continue;
          if (!src[plane] || (plane == 1 && !src[2])) {
-             if(is16BPS(c->dstFormat))
-                 length*=2;
-             fillPlane(dst[plane], dstStride[plane], length, height, y, (plane==3) ? 255 : 128);
+             if (is16BPS(c->dstFormat))
+                 length *= 2;
+             fillPlane(dst[plane], dstStride[plane], length, height, y,
+                       (plane == 3) ? 255 : 128);
          } else {
 -            if (is9_OR_10BPS(c->srcFormat)) {
 +            if(isNBPS(c->srcFormat) || isNBPS(c->dstFormat)
 +               || (is16BPS(c->srcFormat) != is16BPS(c->dstFormat))
 +            ) {
-                 const int src_depth = av_pix_fmt_descriptors[c->srcFormat].comp[plane].depth_minus1+1;
-                 const int dst_depth = av_pix_fmt_descriptors[c->dstFormat].comp[plane].depth_minus1+1;
-                 const uint16_t *srcPtr2 = (const uint16_t*)srcPtr;
+                 const int src_depth = av_pix_fmt_descriptors[c->srcFormat].comp[plane].depth_minus1 + 1;
+                 const int dst_depth = av_pix_fmt_descriptors[c->dstFormat].comp[plane].depth_minus1 + 1;
+                 const uint16_t *srcPtr2 = (const uint16_t *) srcPtr;
 +                uint16_t *dstPtr2 = (uint16_t*)dstPtr;
  
 -                if (is16BPS(c->dstFormat)) {
 -                    uint16_t *dstPtr2 = (uint16_t *) dstPtr;
 -#define COPY9_OR_10TO16(rfunc, wfunc) \
 -                    for (i = 0; i < height; i++) { \
 -                        for (j = 0; j < length; j++) { \
 -                            int srcpx = rfunc(&srcPtr2[j]); \
 -                            wfunc(&dstPtr2[j], (srcpx << (16 - src_depth)) | (srcpx >> (2 * src_depth - 16))); \
 -                        } \
 -                        dstPtr2 += dstStride[plane] / 2; \
 -                        srcPtr2 += srcStride[plane] / 2; \
 +                if (dst_depth == 8) {
 +                    if(isBE(c->srcFormat) == HAVE_BIGENDIAN){
 +                        DITHER_COPY(dstPtr, dstStride[plane], srcPtr2, srcStride[plane]/2, , )
 +                    } else {
 +                        DITHER_COPY(dstPtr, dstStride[plane], srcPtr2, srcStride[plane]/2, av_bswap16, )
                      }
 -                    if (isBE(c->dstFormat)) {
 -                        if (isBE(c->srcFormat)) {
 -                            COPY9_OR_10TO16(AV_RB16, AV_WB16);
 -                        } else {
 -                            COPY9_OR_10TO16(AV_RL16, AV_WB16);
 +                } else if (src_depth == 8) {
 +                    for (i = 0; i < height; i++) {
 +                        #define COPY816(w)\
 +                        if(shiftonly){\
 +                            for (j = 0; j < length; j++)\
 +                                w(&dstPtr2[j], srcPtr[j]<<(dst_depth-8));\
 +                        }else{\
 +                            for (j = 0; j < length; j++)\
 +                                w(&dstPtr2[j], (srcPtr[j]<<(dst_depth-8)) |\
 +                                               (srcPtr[j]>>(2*8-dst_depth)));\
                          }
 -                    } else {
 -                        if (isBE(c->srcFormat)) {
 -                            COPY9_OR_10TO16(AV_RB16, AV_WL16);
 +                        if(isBE(c->dstFormat)){
 +                            COPY816(AV_WB16)
                          } else {
 -                            COPY9_OR_10TO16(AV_RL16, AV_WL16);
 +                            COPY816(AV_WL16)
                          }
 +                        dstPtr2 += dstStride[plane]/2;
 +                        srcPtr  += srcStride[plane];
                      }
 -                } else if (is9_OR_10BPS(c->dstFormat)) {
 -                    uint16_t *dstPtr2 = (uint16_t *) dstPtr;
 -#define COPY9_OR_10TO9_OR_10(loop) \
 -                    for (i = 0; i < height; i++) { \
 -                        for (j = 0; j < length; j++) { \
 -                            loop; \
 -                        } \
 -                        dstPtr2 += dstStride[plane] / 2; \
 -                        srcPtr2 += srcStride[plane] / 2; \
 -                    }
 -#define COPY9_OR_10TO9_OR_10_2(rfunc, wfunc) \
 -                    if (dst_depth > src_depth) { \
 -                        COPY9_OR_10TO9_OR_10(int srcpx = rfunc(&srcPtr2[j]); \
 -                            wfunc(&dstPtr2[j], (srcpx << 1) | (srcpx >> 9))); \
 -                    } else if (dst_depth < src_depth) { \
 -                        DITHER_COPY(dstPtr2, dstStride[plane] / 2, wfunc, \
 -                                    srcPtr2, srcStride[plane] / 2, rfunc, \
 -                                    dither_8x8_1, 1, clip9); \
 -                    } else { \
 -                        COPY9_OR_10TO9_OR_10(wfunc(&dstPtr2[j], rfunc(&srcPtr2[j]))); \
 -                    }
 -                    if (isBE(c->dstFormat)) {
 -                        if (isBE(c->srcFormat)) {
 -                            COPY9_OR_10TO9_OR_10_2(AV_RB16, AV_WB16);
 -                        } else {
 -                            COPY9_OR_10TO9_OR_10_2(AV_RL16, AV_WB16);
 -                        }
 -                    } else {
 -                        if (isBE(c->srcFormat)) {
 -                            COPY9_OR_10TO9_OR_10_2(AV_RB16, AV_WL16);
 +                } else if (src_depth <= dst_depth) {
 +                    for (i = 0; i < height; i++) {
 +#define COPY_UP(r,w) \
 +    if(shiftonly){\
 +        for (j = 0; j < length; j++){ \
 +            unsigned int v= r(&srcPtr2[j]);\
 +            w(&dstPtr2[j], v<<(dst_depth-src_depth));\
 +        }\
 +    }else{\
 +        for (j = 0; j < length; j++){ \
 +            unsigned int v= r(&srcPtr2[j]);\
 +            w(&dstPtr2[j], (v<<(dst_depth-src_depth)) | \
 +                        (v>>(2*src_depth-dst_depth)));\
 +        }\
 +    }
 +                        if(isBE(c->srcFormat)){
 +                            if(isBE(c->dstFormat)){
 +                                COPY_UP(AV_RB16, AV_WB16)
 +                            } else {
 +                                COPY_UP(AV_RB16, AV_WL16)
 +                            }
                          } else {
 -                            COPY9_OR_10TO9_OR_10_2(AV_RL16, AV_WL16);
 +                            if(isBE(c->dstFormat)){
 +                                COPY_UP(AV_RL16, AV_WB16)
 +                            } else {
 +                                COPY_UP(AV_RL16, AV_WL16)
 +                            }
                          }
 +                        dstPtr2 += dstStride[plane]/2;
 +                        srcPtr2 += srcStride[plane]/2;
                      }
                  } else {
 -#define W8(a, b) { *(a) = (b); }
 -#define COPY9_OR_10TO8(rfunc) \
 -                    if (src_depth == 9) { \
 -                        DITHER_COPY(dstPtr,  dstStride[plane],   W8, \
 -                                    srcPtr2, srcStride[plane] / 2, rfunc, \
 -                                    dither_8x8_1, 1, av_clip_uint8); \
 -                    } else { \
 -                        DITHER_COPY(dstPtr,  dstStride[plane],   W8, \
 -                                    srcPtr2, srcStride[plane] / 2, rfunc, \
 -                                    dither_8x8_3, 2, av_clip_uint8); \
 -                    }
 -                    if (isBE(c->srcFormat)) {
 -                        COPY9_OR_10TO8(AV_RB16);
 -                    } else {
 -                        COPY9_OR_10TO8(AV_RL16);
 -                    }
 -                }
 -            } else if (is9_OR_10BPS(c->dstFormat)) {
 -                const int dst_depth = av_pix_fmt_descriptors[c->dstFormat].comp[plane].depth_minus1 + 1;
 -                uint16_t *dstPtr2 = (uint16_t *) dstPtr;
 -
 -                if (is16BPS(c->srcFormat)) {
 -                    const uint16_t *srcPtr2 = (const uint16_t *) srcPtr;
 -#define COPY16TO9_OR_10(rfunc, wfunc) \
 -                    if (dst_depth == 9) { \
 -                        DITHER_COPY(dstPtr2, dstStride[plane] / 2, wfunc, \
 -                                    srcPtr2, srcStride[plane] / 2, rfunc, \
 -                                    dither_8x8_128, 7, clip9); \
 -                    } else { \
 -                        DITHER_COPY(dstPtr2, dstStride[plane] / 2, wfunc, \
 -                                    srcPtr2, srcStride[plane] / 2, rfunc, \
 -                                    dither_8x8_64, 6, clip10); \
 -                    }
 -                    if (isBE(c->dstFormat)) {
 -                        if (isBE(c->srcFormat)) {
 -                            COPY16TO9_OR_10(AV_RB16, AV_WB16);
 +                    if(isBE(c->srcFormat) == HAVE_BIGENDIAN){
 +                        if(isBE(c->dstFormat) == HAVE_BIGENDIAN){
 +                            DITHER_COPY(dstPtr2, dstStride[plane]/2, srcPtr2, srcStride[plane]/2, , )
                          } else {
 -                            COPY16TO9_OR_10(AV_RL16, AV_WB16);
 +                            DITHER_COPY(dstPtr2, dstStride[plane]/2, srcPtr2, srcStride[plane]/2, , av_bswap16)
                          }
 -                    } else {
 -                        if (isBE(c->srcFormat)) {
 -                            COPY16TO9_OR_10(AV_RB16, AV_WL16);
 +                    }else{
 +                        if(isBE(c->dstFormat) == HAVE_BIGENDIAN){
 +                            DITHER_COPY(dstPtr2, dstStride[plane]/2, srcPtr2, srcStride[plane]/2, av_bswap16, )
                          } else {
 -                            COPY16TO9_OR_10(AV_RL16, AV_WL16);
 +                            DITHER_COPY(dstPtr2, dstStride[plane]/2, srcPtr2, srcStride[plane]/2, av_bswap16, av_bswap16)
                          }
                      }
 -                } else /* 8bit */ {
 -#define COPY8TO9_OR_10(wfunc) \
 -                    for (i = 0; i < height; i++) { \
 -                        for (j = 0; j < length; j++) { \
 -                            const int srcpx = srcPtr[j]; \
 -                            wfunc(&dstPtr2[j], (srcpx << (dst_depth - 8)) | (srcpx >> (16 - dst_depth))); \
 -                        } \
 -                        dstPtr2 += dstStride[plane] / 2; \
 -                        srcPtr  += srcStride[plane]; \
 -                    }
 -                    if (isBE(c->dstFormat)) {
 -                        COPY8TO9_OR_10(AV_WB16);
 -                    } else {
 -                        COPY8TO9_OR_10(AV_WL16);
 -                    }
 -                }
 -            } else if (is16BPS(c->srcFormat) && !is16BPS(c->dstFormat)) {
 -                const uint16_t *srcPtr2 = (const uint16_t *) srcPtr;
 -#define COPY16TO8(rfunc) \
 -                    DITHER_COPY(dstPtr,  dstStride[plane],   W8, \
 -                                srcPtr2, srcStride[plane] / 2, rfunc, \
 -                                dither_8x8_256, 8, av_clip_uint8);
 -                if (isBE(c->srcFormat)) {
 -                    COPY16TO8(AV_RB16);
 -                } else {
 -                    COPY16TO8(AV_RL16);
 -                }
 -            } else if (!is16BPS(c->srcFormat) && is16BPS(c->dstFormat)) {
 -                for (i = 0; i < height; i++) {
 -                    for (j = 0; j < length; j++) {
 -                        dstPtr[ j << 1     ] = srcPtr[j];
 -                        dstPtr[(j << 1) + 1] = srcPtr[j];
 -                    }
 -                    srcPtr += srcStride[plane];
 -                    dstPtr += dstStride[plane];
                  }
-             } else if(is16BPS(c->srcFormat) && is16BPS(c->dstFormat)
-                   && isBE(c->srcFormat) != isBE(c->dstFormat)) {
-                 for (i=0; i<height; i++) {
-                     for (j=0; j<length; j++)
-                         ((uint16_t*)dstPtr)[j] = av_bswap16(((const uint16_t*)srcPtr)[j]);
-                     srcPtr+= srcStride[plane];
-                     dstPtr+= dstStride[plane];
+             } else if (is16BPS(c->srcFormat) && is16BPS(c->dstFormat) &&
+                       isBE(c->srcFormat) != isBE(c->dstFormat)) {
+                 for (i = 0; i < height; i++) {
+                     for (j = 0; j < length; j++)
+                         ((uint16_t *) dstPtr)[j] = av_bswap16(((const uint16_t *) srcPtr)[j]);
+                     srcPtr += srcStride[plane];
+                     dstPtr += dstStride[plane];
                  }
              } else if (dstStride[plane] == srcStride[plane] &&
                         srcStride[plane] > 0 && srcStride[plane] == length) {
@@@ -744,8 -797,14 +786,8 @@@ void ff_get_unscaled_swscale(SwsContex
          IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, PIX_FMT_RGB565))
          c->swScale = packed_16bpc_bswap;
  
 -    if ((usePal(srcFormat) && (
 -        dstFormat == PIX_FMT_RGB32   ||
 -        dstFormat == PIX_FMT_RGB32_1 ||
 -        dstFormat == PIX_FMT_RGB24   ||
 -        dstFormat == PIX_FMT_BGR32   ||
 -        dstFormat == PIX_FMT_BGR32_1 ||
 -        dstFormat == PIX_FMT_BGR24)))
 +    if (usePal(srcFormat) && isByteRGB(dstFormat))
-         c->swScale= palToRgbWrapper;
+         c->swScale = palToRgbWrapper;
  
      if (srcFormat == PIX_FMT_YUV422P) {
          if (dstFormat == PIX_FMT_YUYV422)
@@@ -859,40 -922,40 +905,40 @@@ int attribute_align_arg sws_scale(struc
      }
  
      if (usePal(c->srcFormat)) {
-         for (i=0; i<256; i++) {
+         for (i = 0; i < 256; i++) {
 -            int p, r, g, b, y, u, v;
 +            int p, r, g, b, y, u, v, a = 0xff;
-             if(c->srcFormat == PIX_FMT_PAL8) {
-                 p=((const uint32_t*)(srcSlice[1]))[i];
-                 a= (p>>24)&0xFF;
-                 r= (p>>16)&0xFF;
-                 g= (p>> 8)&0xFF;
-                 b=  p     &0xFF;
-             } else if(c->srcFormat == PIX_FMT_RGB8) {
-                 r= (i>>5    )*36;
-                 g= ((i>>2)&7)*36;
-                 b= (i&3     )*85;
-             } else if(c->srcFormat == PIX_FMT_BGR8) {
-                 b= (i>>6    )*85;
-                 g= ((i>>3)&7)*36;
-                 r= (i&7     )*36;
-             } else if(c->srcFormat == PIX_FMT_RGB4_BYTE) {
-                 r= (i>>3    )*255;
-                 g= ((i>>1)&3)*85;
-                 b= (i&1     )*255;
-             } else if(c->srcFormat == PIX_FMT_GRAY8 || c->srcFormat == PIX_FMT_GRAY8A) {
+             if (c->srcFormat == PIX_FMT_PAL8) {
+                 p = ((const uint32_t *)(srcSlice[1]))[i];
++                a = (p >> 24) & 0xFF;
+                 r = (p >> 16) & 0xFF;
+                 g = (p >>  8) & 0xFF;
+                 b =  p        & 0xFF;
+             } else if (c->srcFormat == PIX_FMT_RGB8) {
+                 r = ( i >> 5     ) * 36;
+                 g = ((i >> 2) & 7) * 36;
+                 b = ( i       & 3) * 85;
+             } else if (c->srcFormat == PIX_FMT_BGR8) {
+                 b = ( i >> 6     ) * 85;
+                 g = ((i >> 3) & 7) * 36;
+                 r = ( i       & 7) * 36;
+             } else if (c->srcFormat == PIX_FMT_RGB4_BYTE) {
+                 r = ( i >> 3     ) * 255;
+                 g = ((i >> 1) & 3) * 85;
+                 b = ( i       & 1) * 255;
 -            } else if (c->srcFormat == PIX_FMT_GRAY8 ||
 -                      c->srcFormat == PIX_FMT_Y400A) {
++            } else if (c->srcFormat == PIX_FMT_GRAY8 || c->srcFormat == PIX_FMT_GRAY8A) {
                  r = g = b = i;
              } else {
                  assert(c->srcFormat == PIX_FMT_BGR4_BYTE);
-                 b= (i>>3    )*255;
-                 g= ((i>>1)&3)*85;
-                 r= (i&1     )*255;
+                 b = ( i >> 3     ) * 255;
+                 g = ((i >> 1) & 3) * 85;
+                 r = ( i       & 1) * 255;
              }
-             y= av_clip_uint8((RY*r + GY*g + BY*b + ( 33<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT);
-             u= av_clip_uint8((RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT);
-             v= av_clip_uint8((RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT);
+             y = av_clip_uint8((RY * r + GY * g + BY * b + ( 33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
+             u = av_clip_uint8((RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
+             v = av_clip_uint8((RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
 -            c->pal_yuv[i] = y + (u << 8) + (v << 16);
 +            c->pal_yuv[i]= y + (u<<8) + (v<<16) + (a<<24);
  
-             switch(c->dstFormat) {
+             switch (c->dstFormat) {
              case PIX_FMT_BGR32:
  #if !HAVE_BIGENDIAN
              case PIX_FMT_RGB24:
      // copy strides, so they can safely be modified
      if (c->sliceDir == 1) {
          // slices go from top to bottom
-         int srcStride2[4]= {srcStride[0], srcStride[1], srcStride[2], srcStride[3]};
-         int dstStride2[4]= {dstStride[0], dstStride[1], dstStride[2], dstStride[3]};
+         int srcStride2[4] = { srcStride[0], srcStride[1], srcStride[2],
+                               srcStride[3] };
+         int dstStride2[4] = { dstStride[0], dstStride[1], dstStride[2],
+                               dstStride[3] };
  
          reset_ptr(src2, c->srcFormat);
 -        reset_ptr((const uint8_t **) dst2, c->dstFormat);
 +        reset_ptr((void*)dst2, c->dstFormat);
  
          /* reset slice direction at end of frame */
          if (srcSliceY + srcSliceH == c->srcH)
              c->sliceDir = 0;
  
-         return c->swScale(c, src2, srcStride2, srcSliceY, srcSliceH, dst2, dstStride2);
+         return c->swScale(c, src2, srcStride2, srcSliceY, srcSliceH, dst2,
+                           dstStride2);
      } else {
          // slices go from bottom to top => we flip the image internally
-         int srcStride2[4]= {-srcStride[0], -srcStride[1], -srcStride[2], -srcStride[3]};
-         int dstStride2[4]= {-dstStride[0], -dstStride[1], -dstStride[2], -dstStride[3]};
+         int srcStride2[4] = { -srcStride[0], -srcStride[1], -srcStride[2],
+                               -srcStride[3] };
+         int dstStride2[4] = { -dstStride[0], -dstStride[1], -dstStride[2],
+                               -dstStride[3] };
  
-         src2[0] += (srcSliceH-1)*srcStride[0];
+         src2[0] += (srcSliceH - 1) * srcStride[0];
          if (!usePal(c->srcFormat))
-             src2[1] += ((srcSliceH>>c->chrSrcVSubSample)-1)*srcStride[1];
-         src2[2] += ((srcSliceH>>c->chrSrcVSubSample)-1)*srcStride[2];
-         src2[3] += (srcSliceH-1)*srcStride[3];
-         dst2[0] += ( c->dstH                      -1)*dstStride[0];
-         dst2[1] += ((c->dstH>>c->chrDstVSubSample)-1)*dstStride[1];
-         dst2[2] += ((c->dstH>>c->chrDstVSubSample)-1)*dstStride[2];
-         dst2[3] += ( c->dstH                      -1)*dstStride[3];
+             src2[1] += ((srcSliceH >> c->chrSrcVSubSample) - 1) * srcStride[1];
+         src2[2] += ((srcSliceH >> c->chrSrcVSubSample) - 1) * srcStride[2];
+         src2[3] += (srcSliceH - 1) * srcStride[3];
+         dst2[0] += ( c->dstH                         - 1) * dstStride[0];
+         dst2[1] += ((c->dstH >> c->chrDstVSubSample) - 1) * dstStride[1];
+         dst2[2] += ((c->dstH >> c->chrDstVSubSample) - 1) * dstStride[2];
+         dst2[3] += ( c->dstH                         - 1) * dstStride[3];
  
          reset_ptr(src2, c->srcFormat);
 -        reset_ptr((const uint8_t **) dst2, c->dstFormat);
 +        reset_ptr((void*)dst2, c->dstFormat);
  
          /* reset slice direction at end of frame */
          if (!srcSliceY)