Merge commit '019ab88a95cb31b698506d90e8ce56695a7f1cc5'
authorJames Almer <jamrial@gmail.com>
Mon, 8 May 2017 16:11:17 +0000 (13:11 -0300)
committerJames Almer <jamrial@gmail.com>
Mon, 8 May 2017 17:22:43 +0000 (14:22 -0300)
* commit '019ab88a95cb31b698506d90e8ce56695a7f1cc5':
  lavc: add an option for exporting cropping information to the caller

Merged-by: James Almer <jamrial@gmail.com>
1  2 
doc/APIchanges
libavcodec/avcodec.h
libavcodec/decode.c
libavcodec/internal.h
libavcodec/options_table.h
libavcodec/version.h
tests/ref/fate/api-mjpeg-codec-param
tests/ref/fate/api-png-codec-param

diff --cc doc/APIchanges
@@@ -15,7 -13,11 +15,11 @@@ libavutil:     2015-08-2
  
  API changes, most recent first:
  
 -2016-xx-xx - xxxxxxx - lavc 57.31.0 - avcodec.h
++2017-xx-xx - xxxxxxx - lavc 57.95.100 / 57.31.0 - avcodec.h
+   Add AVCodecContext.apply_cropping to control whether cropping
+   is handled by libavcodec or the caller.
 -2016-xx-xx - xxxxxxx - lavu 55.30.0 - frame.h
 +2017-xx-xx - xxxxxxx - lavu 55.62.100 / 55.30.0 - frame.h
    Add AVFrame.crop_left/right/top/bottom fields for attaching cropping
    information to video frames.
  
@@@ -3585,84 -3114,33 +3585,111 @@@ typedef struct AVCodecContext 
      AVBufferRef *hw_frames_ctx;
  
      /**
 +     * Control the form of AVSubtitle.rects[N]->ass
 +     * - decoding: set by user
 +     * - encoding: unused
 +     */
 +    int sub_text_format;
 +#define FF_SUB_TEXT_FMT_ASS              0
 +#if FF_API_ASS_TIMING
 +#define FF_SUB_TEXT_FMT_ASS_WITH_TIMINGS 1
 +#endif
 +
 +    /**
 +     * Audio only. The amount of padding (in samples) appended by the encoder to
 +     * the end of the audio. I.e. this number of decoded samples must be
 +     * discarded by the caller from the end of the stream to get the original
 +     * audio without any trailing padding.
 +     *
 +     * - decoding: unused
 +     * - encoding: unused
 +     */
 +    int trailing_padding;
 +
 +    /**
 +     * The number of pixels per image to maximally accept.
 +     *
 +     * - decoding: set by user
 +     * - encoding: set by user
 +     */
 +    int64_t max_pixels;
 +
 +    /**
 +     * A reference to the AVHWDeviceContext describing the device which will
 +     * be used by a hardware encoder/decoder.  The reference is set by the
 +     * caller and afterwards owned (and freed) by libavcodec.
 +     *
 +     * This should be used if either the codec device does not require
 +     * hardware frames or any that are used are to be allocated internally by
 +     * libavcodec.  If the user wishes to supply any of the frames used as
 +     * encoder input or decoder output then hw_frames_ctx should be used
 +     * instead.  When hw_frames_ctx is set in get_format() for a decoder, this
 +     * field will be ignored while decoding the associated stream segment, but
 +     * may again be used on a following one after another get_format() call.
 +     *
 +     * For both encoders and decoders this field should be set before
 +     * avcodec_open2() is called and must not be written to thereafter.
 +     *
 +     * Note that some decoders may require this field to be set initially in
 +     * order to support hw_frames_ctx at all - in that case, all frames
 +     * contexts used must be created on the same device.
 +     */
 +    AVBufferRef *hw_device_ctx;
 +
 +    /**
 +     * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated
 +     * decoding (if active).
 +     * - encoding: unused
 +     * - decoding: Set by user (either before avcodec_open2(), or in the
 +     *             AVCodecContext.get_format callback)
 +     */
 +    int hwaccel_flags;
++
++    /**
+      * Video decoding only. Certain video codecs support cropping, meaning that
+      * only a sub-rectangle of the decoded frame is intended for display.  This
+      * option controls how cropping is handled by libavcodec.
+      *
+      * When set to 1 (the default), libavcodec will apply cropping internally.
+      * I.e. it will modify the output frame width/height fields and offset the
+      * data pointers (only by as much as possible while preserving alignment, or
+      * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that
+      * the frames output by the decoder refer only to the cropped area. The
+      * crop_* fields of the output frames will be zero.
+      *
+      * When set to 0, the width/height fields of the output frames will be set
+      * to the coded dimensions and the crop_* fields will describe the cropping
+      * rectangle. Applying the cropping is left to the caller.
+      *
+      * @warning When hardware acceleration with opaque output frames is used,
+      * libavcodec is unable to apply cropping from the top/left border.
+      *
+      * @note when this option is set to zero, the width/height fields of the
+      * AVCodecContext and output AVFrames have different meanings. The codec
+      * context fields store display dimensions (with the coded dimensions in
+      * coded_width/height), while the frame fields store the coded dimensions
+      * (with the display dimensions being determined by the crop_* fields).
+      */
+     int apply_cropping;
  } AVCodecContext;
  
 +AVRational av_codec_get_pkt_timebase         (const AVCodecContext *avctx);
 +void       av_codec_set_pkt_timebase         (AVCodecContext *avctx, AVRational val);
 +
 +const AVCodecDescriptor *av_codec_get_codec_descriptor(const AVCodecContext *avctx);
 +void                     av_codec_set_codec_descriptor(AVCodecContext *avctx, const AVCodecDescriptor *desc);
 +
 +unsigned av_codec_get_codec_properties(const AVCodecContext *avctx);
 +
 +int  av_codec_get_lowres(const AVCodecContext *avctx);
 +void av_codec_set_lowres(AVCodecContext *avctx, int val);
 +
 +int  av_codec_get_seek_preroll(const AVCodecContext *avctx);
 +void av_codec_set_seek_preroll(AVCodecContext *avctx, int val);
 +
 +uint16_t *av_codec_get_chroma_intra_matrix(const AVCodecContext *avctx);
 +void av_codec_set_chroma_intra_matrix(AVCodecContext *avctx, uint16_t *val);
 +
  /**
   * AVProfile.
   */
@@@ -34,7 -29,7 +34,8 @@@
  #include "libavutil/frame.h"
  #include "libavutil/hwcontext.h"
  #include "libavutil/imgutils.h"
 +#include "libavutil/internal.h"
+ #include "libavutil/intmath.h"
  
  #include "avcodec.h"
  #include "bytestream.h"
@@@ -682,6 -451,111 +683,112 @@@ int attribute_align_arg avcodec_send_pa
      return 0;
  }
  
 -               "Invalid cropping information set by a decoder: %zu/%zu/%zu/%zu "
+ static int calc_cropping_offsets(size_t offsets[4], const AVFrame *frame,
+                                  const AVPixFmtDescriptor *desc)
+ {
+     int i, j;
+     for (i = 0; frame->data[i]; i++) {
+         const AVComponentDescriptor *comp = NULL;
+         int shift_x = (i == 1 || i == 2) ? desc->log2_chroma_w : 0;
+         int shift_y = (i == 1 || i == 2) ? desc->log2_chroma_h : 0;
+         if (desc->flags & (AV_PIX_FMT_FLAG_PAL | AV_PIX_FMT_FLAG_PSEUDOPAL) && i == 1) {
+             offsets[i] = 0;
+             break;
+         }
+         /* find any component descriptor for this plane */
+         for (j = 0; j < desc->nb_components; j++) {
+             if (desc->comp[j].plane == i) {
+                 comp = &desc->comp[j];
+                 break;
+             }
+         }
+         if (!comp)
+             return AVERROR_BUG;
+         offsets[i] = (frame->crop_top  >> shift_y) * frame->linesize[i] +
+                      (frame->crop_left >> shift_x) * comp->step;
+     }
+     return 0;
+ }
+ static int apply_cropping(AVCodecContext *avctx, AVFrame *frame)
+ {
+     const AVPixFmtDescriptor *desc;
+     size_t offsets[4];
+     int i;
+     /* make sure we are noisy about decoders returning invalid cropping data */
+     if (frame->crop_left >= INT_MAX - frame->crop_right        ||
+         frame->crop_top  >= INT_MAX - frame->crop_bottom       ||
+         (frame->crop_left + frame->crop_right) >= frame->width ||
+         (frame->crop_top + frame->crop_bottom) >= frame->height) {
+         av_log(avctx, AV_LOG_WARNING,
 -            int log2_align = offsets[i] ? av_ctz(offsets[i]) : INT_MAX;
++               "Invalid cropping information set by a decoder: "
++               "%"SIZE_SPECIFIER"/%"SIZE_SPECIFIER"/%"SIZE_SPECIFIER"/%"SIZE_SPECIFIER" "
+                "(frame size %dx%d). This is a bug, please report it\n",
+                frame->crop_left, frame->crop_right, frame->crop_top, frame->crop_bottom,
+                frame->width, frame->height);
+         frame->crop_left   = 0;
+         frame->crop_right  = 0;
+         frame->crop_top    = 0;
+         frame->crop_bottom = 0;
+         return 0;
+     }
+     if (!avctx->apply_cropping)
+         return 0;
+     desc = av_pix_fmt_desc_get(frame->format);
+     if (!desc)
+         return AVERROR_BUG;
+     /* Apply just the right/bottom cropping for hwaccel formats. Bitstream
+      * formats cannot be easily handled here either (and corresponding decoders
+      * should not export any cropping anyway), so do the same for those as well.
+      * */
+     if (desc->flags & (AV_PIX_FMT_FLAG_BITSTREAM | AV_PIX_FMT_FLAG_HWACCEL)) {
+         frame->width      -= frame->crop_right;
+         frame->height     -= frame->crop_bottom;
+         frame->crop_right  = 0;
+         frame->crop_bottom = 0;
+         return 0;
+     }
+     /* calculate the offsets for each plane */
+     calc_cropping_offsets(offsets, frame, desc);
+     /* adjust the offsets to avoid breaking alignment */
+     if (!(avctx->flags & AV_CODEC_FLAG_UNALIGNED)) {
+         int min_log2_align = INT_MAX;
+         for (i = 0; frame->data[i]; i++) {
++            int log2_align = offsets[i] ? ff_ctz(offsets[i]) : INT_MAX;
+             min_log2_align = FFMIN(log2_align, min_log2_align);
+         }
+         if (min_log2_align < 5) {
+             frame->crop_left &= ~((1 << min_log2_align) - 1);
+             calc_cropping_offsets(offsets, frame, desc);
+         }
+     }
+     for (i = 0; frame->data[i]; i++)
+         frame->data[i] += offsets[i];
+     frame->width      -= (frame->crop_left + frame->crop_right);
+     frame->height     -= (frame->crop_top  + frame->crop_bottom);
+     frame->crop_left   = 0;
+     frame->crop_right  = 0;
+     frame->crop_top    = 0;
+     frame->crop_bottom = 0;
+     return 0;
+ }
  int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
  {
      AVCodecInternal *avci = avctx->internal;
@@@ -1607,11 -1141,10 +1722,12 @@@ static int get_buffer_internal(AVCodecC
          avctx->sw_pix_fmt = avctx->pix_fmt;
  
      ret = avctx->get_buffer2(avctx, frame, flags);
 +    if (ret >= 0)
 +        validate_avframe_allocation(avctx, frame);
  
  end:
-     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO && !override_dimensions) {
+     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO && !override_dimensions &&
+         !(avctx->codec->caps_internal & FF_CODEC_CAP_EXPORTS_CROPPING)) {
          frame->width  = avctx->width;
          frame->height = avctx->height;
      }
   */
  #define FF_CODEC_CAP_SETS_PKT_DTS           (1 << 2)
  /**
 -#define FF_CODEC_CAP_EXPORTS_CROPPING       (1 << 3)
 -
 -#ifdef DEBUG
 -#   define ff_dlog(ctx, ...) av_log(ctx, AV_LOG_DEBUG, __VA_ARGS__)
 -#else
 -#   define ff_dlog(ctx, ...) do { } while (0)
 -#endif
 + * The decoder extracts and fills its parameters even if the frame is
 + * skipped due to the skip_frame setting.
 + */
 +#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM  (1 << 3)
++/**
+  * The decoder sets the cropping fields in the output frames manually.
+  * If this cap is set, the generic code will initialize output frame
+  * dimensions to coded rather than display values.
+  */
++#define FF_CODEC_CAP_EXPORTS_CROPPING       (1 << 4)
  
  #ifdef TRACE
  #   define ff_tlog(ctx, ...) av_log(ctx, AV_LOG_TRACE, __VA_ARGS__)
@@@ -541,38 -516,22 +541,39 @@@ static const AVOption avcodec_options[
  {"em", "Emergency",          0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_EMERGENCY },         INT_MIN, INT_MAX, A|E, "audio_service_type"},
  {"vo", "Voice Over",         0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_VOICE_OVER },        INT_MIN, INT_MAX, A|E, "audio_service_type"},
  {"ka", "Karaoke",            0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_KARAOKE },           INT_MIN, INT_MAX, A|E, "audio_service_type"},
 -{"request_sample_fmt", NULL, OFFSET(request_sample_fmt), AV_OPT_TYPE_INT, {.i64 = AV_SAMPLE_FMT_NONE }, AV_SAMPLE_FMT_NONE, INT_MAX, A|D, "request_sample_fmt"},
 -{"u8" , "8-bit unsigned integer", 0, AV_OPT_TYPE_CONST, {.i64 = AV_SAMPLE_FMT_U8  }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
 -{"s16", "16-bit signed integer",  0, AV_OPT_TYPE_CONST, {.i64 = AV_SAMPLE_FMT_S16 }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
 -{"s32", "32-bit signed integer",  0, AV_OPT_TYPE_CONST, {.i64 = AV_SAMPLE_FMT_S32 }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
 -{"flt", "32-bit float",           0, AV_OPT_TYPE_CONST, {.i64 = AV_SAMPLE_FMT_FLT }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
 -{"dbl", "64-bit double",          0, AV_OPT_TYPE_CONST, {.i64 = AV_SAMPLE_FMT_DBL }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
 -{"u8p" , "8-bit unsigned integer planar", 0, AV_OPT_TYPE_CONST, {.i64 = AV_SAMPLE_FMT_U8P  }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
 -{"s16p", "16-bit signed integer planar",  0, AV_OPT_TYPE_CONST, {.i64 = AV_SAMPLE_FMT_S16P }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
 -{"s32p", "32-bit signed integer planar",  0, AV_OPT_TYPE_CONST, {.i64 = AV_SAMPLE_FMT_S32P }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
 -{"fltp", "32-bit float planar",           0, AV_OPT_TYPE_CONST, {.i64 = AV_SAMPLE_FMT_FLTP }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
 -{"dblp", "64-bit double planar",          0, AV_OPT_TYPE_CONST, {.i64 = AV_SAMPLE_FMT_DBLP }, INT_MIN, INT_MAX, A|D, "request_sample_fmt"},
 -{"refcounted_frames", NULL, OFFSET(refcounted_frames), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, A|V|D },
 +{"request_sample_fmt", "sample format audio decoders should prefer", OFFSET(request_sample_fmt), AV_OPT_TYPE_SAMPLE_FMT, {.i64=AV_SAMPLE_FMT_NONE}, -1, INT_MAX, A|D, "request_sample_fmt"},
 +{"pkt_timebase", NULL, OFFSET(pkt_timebase), AV_OPT_TYPE_RATIONAL, {.dbl = 0 }, 0, INT_MAX, 0},
 +{"sub_charenc", "set input text subtitles character encoding", OFFSET(sub_charenc), AV_OPT_TYPE_STRING, {.str = NULL}, CHAR_MIN, CHAR_MAX, S|D},
 +{"sub_charenc_mode", "set input text subtitles character encoding mode", OFFSET(sub_charenc_mode), AV_OPT_TYPE_FLAGS, {.i64 = FF_SUB_CHARENC_MODE_AUTOMATIC}, -1, INT_MAX, S|D, "sub_charenc_mode"},
 +{"do_nothing",  NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_CHARENC_MODE_DO_NOTHING},  INT_MIN, INT_MAX, S|D, "sub_charenc_mode"},
 +{"auto",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_CHARENC_MODE_AUTOMATIC},   INT_MIN, INT_MAX, S|D, "sub_charenc_mode"},
 +{"pre_decoder", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_CHARENC_MODE_PRE_DECODER}, INT_MIN, INT_MAX, S|D, "sub_charenc_mode"},
 +#if FF_API_ASS_TIMING
 +{"sub_text_format", "set decoded text subtitle format", OFFSET(sub_text_format), AV_OPT_TYPE_INT, {.i64 = FF_SUB_TEXT_FMT_ASS_WITH_TIMINGS}, 0, 1, S|D, "sub_text_format"},
 +#else
 +{"sub_text_format", "set decoded text subtitle format", OFFSET(sub_text_format), AV_OPT_TYPE_INT, {.i64 = FF_SUB_TEXT_FMT_ASS}, 0, 1, S|D, "sub_text_format"},
 +#endif
 +{"ass",              NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_TEXT_FMT_ASS},              INT_MIN, INT_MAX, S|D, "sub_text_format"},
 +#if FF_API_ASS_TIMING
 +{"ass_with_timings", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_TEXT_FMT_ASS_WITH_TIMINGS}, INT_MIN, INT_MAX, S|D, "sub_text_format"},
 +#endif
 +{"refcounted_frames", NULL, OFFSET(refcounted_frames), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, A|V|D },
  #if FF_API_SIDEDATA_ONLY_PKT
 -{"side_data_only_packets", NULL, OFFSET(side_data_only_packets), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, A|V|E },
 -#endif
 -{"apply_cropping", NULL, OFFSET(apply_cropping), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, V | D },
 +{"side_data_only_packets", NULL, OFFSET(side_data_only_packets), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, A|V|E },
 +#endif
++{"apply_cropping", NULL, OFFSET(apply_cropping), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, V | D },
 +{"skip_alpha", "Skip processing alpha", OFFSET(skip_alpha), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, V|D },
 +{"field_order", "Field order", OFFSET(field_order), AV_OPT_TYPE_INT, {.i64 = AV_FIELD_UNKNOWN }, 0, 5, V|D|E, "field_order" },
 +{"progressive", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_PROGRESSIVE }, 0, 0, V|D|E, "field_order" },
 +{"tt", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_TT }, 0, 0, V|D|E, "field_order" },
 +{"bb", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_BB }, 0, 0, V|D|E, "field_order" },
 +{"tb", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_TB }, 0, 0, V|D|E, "field_order" },
 +{"bt", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_BT }, 0, 0, V|D|E, "field_order" },
 +{"dump_separator", "set information dump field separator", OFFSET(dump_separator), AV_OPT_TYPE_STRING, {.str = NULL}, CHAR_MIN, CHAR_MAX, A|V|S|D|E},
 +{"codec_whitelist", "List of decoders that are allowed to be used", OFFSET(codec_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  CHAR_MIN, CHAR_MAX, A|V|S|D },
 +{"pixel_format", "set pixel format", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64=AV_PIX_FMT_NONE}, -1, INT_MAX, 0 },
 +{"video_size", "set video size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str=NULL}, 0, INT_MAX, 0 },
 +{"max_pixels", "Maximum number of pixels", OFFSET(max_pixels), AV_OPT_TYPE_INT64, {.i64 = INT_MAX }, 0, INT_MAX, A|V|S|D|E },
  {NULL},
  };
  
@@@ -27,9 -27,9 +27,9 @@@
  
  #include "libavutil/version.h"
  
 -#define LIBAVCODEC_VERSION_MAJOR 57
 -#define LIBAVCODEC_VERSION_MINOR 31
 -#define LIBAVCODEC_VERSION_MICRO  0
 +#define LIBAVCODEC_VERSION_MAJOR  57
- #define LIBAVCODEC_VERSION_MINOR  94
- #define LIBAVCODEC_VERSION_MICRO 101
++#define LIBAVCODEC_VERSION_MINOR  95
++#define LIBAVCODEC_VERSION_MICRO 100
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
index 08313ad,0000000..6a5d4d3
mode 100644,000000..100644
--- /dev/null
@@@ -1,316 -1,0 +1,318 @@@
 +stream=0, decode=0
 +    b=0
 +    ab=0
 +    bt=4000000
 +    flags=0x00000000
 +    me_method=5
 +    time_base=0/1
 +    g=12
 +    ar=0
 +    ac=0
 +    cutoff=0
 +    frame_size=0
 +    delay=0
 +    qcomp=0.500000
 +    qblur=0.500000
 +    qmin=2
 +    qmax=31
 +    qdiff=3
 +    bf=0
 +    b_qfactor=1.250000
 +    rc_strategy=0
 +    b_strategy=0
 +    ps=0
 +    mv_bits=0
 +    header_bits=0
 +    i_tex_bits=0
 +    p_tex_bits=0
 +    i_count=0
 +    p_count=0
 +    skip_count=0
 +    misc_bits=0
 +    frame_bits=0
 +    codec_tag=0
 +    bug=0x00000001
 +    strict=0
 +    b_qoffset=1.250000
 +    err_detect=0x00000000
 +    has_b_frames=0
 +    block_align=0
 +    mpeg_quant=0
 +    qsquish=0.000000
 +    rc_qmod_amp=0.000000
 +    rc_qmod_freq=0
 +    rc_override_count=0
 +    rc_eq=
 +    maxrate=0
 +    minrate=0
 +    bufsize=0
 +    rc_buf_aggressivity=1.000000
 +    i_qfactor=-0.800000
 +    i_qoffset=0.000000
 +    rc_init_cplx=0.000000
 +    dct=0
 +    lumi_mask=0.000000
 +    tcplx_mask=0.000000
 +    scplx_mask=0.000000
 +    p_mask=0.000000
 +    dark_mask=0.000000
 +    idct=0
 +    slice_count=0
 +    ec=0x00000003
 +    bits_per_coded_sample=0
 +    pred=0
 +    aspect=180/180
 +    sar=180/180
 +    debug=0x00000000
 +    vismv=0x00000000
 +    cmp=0
 +    subcmp=0
 +    mbcmp=0
 +    ildctcmp=8
 +    dia_size=0
 +    last_pred=0
 +    preme=0
 +    precmp=0
 +    pre_dia_size=0
 +    subq=8
 +    dtg_active_format=0
 +    me_range=0
 +    ibias=999999
 +    pbias=999999
 +    global_quality=0
 +    coder=0
 +    context=0
 +    slice_flags=0
 +    xvmc_acceleration=0
 +    mbd=0
 +    stream_codec_tag=0
 +    sc_threshold=0
 +    lmin=0
 +    lmax=0
 +    nr=0
 +    rc_init_occupancy=0
 +    flags2=0x00000000
 +    error=0
 +    threads=1
 +    me_threshold=0
 +    mb_threshold=0
 +    dc=0
 +    nssew=8
 +    skip_top=0
 +    skip_bottom=0
 +    profile=-99
 +    level=-99
 +    lowres=0
 +    skip_threshold=0
 +    skip_factor=0
 +    skip_exp=0
 +    skipcmp=13
 +    border_mask=0.000000
 +    mblmin=236
 +    mblmax=3658
 +    mepc=256
 +    skip_loop_filter=0
 +    skip_idct=0
 +    skip_frame=0
 +    bidir_refine=1
 +    brd_scale=0
 +    keyint_min=25
 +    refs=1
 +    chromaoffset=0
 +    trellis=0
 +    sc_factor=6
 +    mv0_threshold=256
 +    b_sensitivity=40
 +    compression_level=-1
 +    min_prediction_order=-1
 +    max_prediction_order=-1
 +    timecode_frame_start=-1
 +    bits_per_raw_sample=8
 +    channel_layout=0
 +    request_channel_layout=0
 +    rc_max_vbv_use=0.000000
 +    rc_min_vbv_use=3.000000
 +    ticks_per_frame=1
 +    color_primaries=2
 +    color_trc=2
 +    colorspace=5
 +    color_range=2
 +    chroma_sample_location=2
 +    log_level_offset=0
 +    slices=0
 +    thread_type=0x00000003
 +    audio_service_type=0
 +    request_sample_fmt=none
 +    pkt_timebase=1/25
 +    sub_charenc=
 +    sub_charenc_mode=0x00000000
 +    sub_text_format=1
 +    refcounted_frames=false
 +    side_data_only_packets=true
++    apply_cropping=true
 +    skip_alpha=false
 +    field_order=0
 +    dump_separator=
 +    codec_whitelist=
 +    pixel_format=yuvj422p
 +    video_size=400x225
 +    max_pixels=2147483647
 +stream=0, decode=1
 +    b=0
 +    ab=0
 +    bt=4000000
 +    flags=0x00000000
 +    me_method=5
 +    time_base=0/1
 +    g=12
 +    ar=0
 +    ac=0
 +    cutoff=0
 +    frame_size=0
 +    delay=0
 +    qcomp=0.500000
 +    qblur=0.500000
 +    qmin=2
 +    qmax=31
 +    qdiff=3
 +    bf=0
 +    b_qfactor=1.250000
 +    rc_strategy=0
 +    b_strategy=0
 +    ps=0
 +    mv_bits=0
 +    header_bits=0
 +    i_tex_bits=0
 +    p_tex_bits=0
 +    i_count=0
 +    p_count=0
 +    skip_count=0
 +    misc_bits=0
 +    frame_bits=0
 +    codec_tag=0
 +    bug=0x00000001
 +    strict=0
 +    b_qoffset=1.250000
 +    err_detect=0x00000000
 +    has_b_frames=0
 +    block_align=0
 +    mpeg_quant=0
 +    qsquish=0.000000
 +    rc_qmod_amp=0.000000
 +    rc_qmod_freq=0
 +    rc_override_count=0
 +    rc_eq=
 +    maxrate=0
 +    minrate=0
 +    bufsize=0
 +    rc_buf_aggressivity=1.000000
 +    i_qfactor=-0.800000
 +    i_qoffset=0.000000
 +    rc_init_cplx=0.000000
 +    dct=0
 +    lumi_mask=0.000000
 +    tcplx_mask=0.000000
 +    scplx_mask=0.000000
 +    p_mask=0.000000
 +    dark_mask=0.000000
 +    idct=0
 +    slice_count=0
 +    ec=0x00000003
 +    bits_per_coded_sample=0
 +    pred=0
 +    aspect=180/180
 +    sar=180/180
 +    debug=0x00000000
 +    vismv=0x00000000
 +    cmp=0
 +    subcmp=0
 +    mbcmp=0
 +    ildctcmp=8
 +    dia_size=0
 +    last_pred=0
 +    preme=0
 +    precmp=0
 +    pre_dia_size=0
 +    subq=8
 +    dtg_active_format=0
 +    me_range=0
 +    ibias=999999
 +    pbias=999999
 +    global_quality=0
 +    coder=0
 +    context=0
 +    slice_flags=0
 +    xvmc_acceleration=0
 +    mbd=0
 +    stream_codec_tag=0
 +    sc_threshold=0
 +    lmin=0
 +    lmax=0
 +    nr=0
 +    rc_init_occupancy=0
 +    flags2=0x00000000
 +    error=0
 +    threads=1
 +    me_threshold=0
 +    mb_threshold=0
 +    dc=0
 +    nssew=8
 +    skip_top=0
 +    skip_bottom=0
 +    profile=-99
 +    level=-99
 +    lowres=0
 +    skip_threshold=0
 +    skip_factor=0
 +    skip_exp=0
 +    skipcmp=13
 +    border_mask=0.000000
 +    mblmin=236
 +    mblmax=3658
 +    mepc=256
 +    skip_loop_filter=0
 +    skip_idct=0
 +    skip_frame=0
 +    bidir_refine=1
 +    brd_scale=0
 +    keyint_min=25
 +    refs=1
 +    chromaoffset=0
 +    trellis=0
 +    sc_factor=6
 +    mv0_threshold=256
 +    b_sensitivity=40
 +    compression_level=-1
 +    min_prediction_order=-1
 +    max_prediction_order=-1
 +    timecode_frame_start=-1
 +    bits_per_raw_sample=8
 +    channel_layout=0
 +    request_channel_layout=0
 +    rc_max_vbv_use=0.000000
 +    rc_min_vbv_use=3.000000
 +    ticks_per_frame=1
 +    color_primaries=2
 +    color_trc=2
 +    colorspace=5
 +    color_range=2
 +    chroma_sample_location=2
 +    log_level_offset=0
 +    slices=0
 +    thread_type=0x00000003
 +    audio_service_type=0
 +    request_sample_fmt=none
 +    pkt_timebase=1/25
 +    sub_charenc=
 +    sub_charenc_mode=0x00000000
 +    sub_text_format=1
 +    refcounted_frames=false
 +    side_data_only_packets=true
++    apply_cropping=true
 +    skip_alpha=false
 +    field_order=0
 +    dump_separator=
 +    codec_whitelist=
 +    pixel_format=yuvj422p
 +    video_size=400x225
 +    max_pixels=2147483647
index 7a9a921,0000000..c51957e
mode 100644,000000..100644
--- /dev/null
@@@ -1,316 -1,0 +1,318 @@@
 +stream=0, decode=0
 +    b=0
 +    ab=0
 +    bt=4000000
 +    flags=0x00000000
 +    me_method=5
 +    time_base=0/1
 +    g=12
 +    ar=0
 +    ac=0
 +    cutoff=0
 +    frame_size=0
 +    delay=0
 +    qcomp=0.500000
 +    qblur=0.500000
 +    qmin=2
 +    qmax=31
 +    qdiff=3
 +    bf=0
 +    b_qfactor=1.250000
 +    rc_strategy=0
 +    b_strategy=0
 +    ps=0
 +    mv_bits=0
 +    header_bits=0
 +    i_tex_bits=0
 +    p_tex_bits=0
 +    i_count=0
 +    p_count=0
 +    skip_count=0
 +    misc_bits=0
 +    frame_bits=0
 +    codec_tag=0
 +    bug=0x00000001
 +    strict=0
 +    b_qoffset=1.250000
 +    err_detect=0x00000000
 +    has_b_frames=0
 +    block_align=0
 +    mpeg_quant=0
 +    qsquish=0.000000
 +    rc_qmod_amp=0.000000
 +    rc_qmod_freq=0
 +    rc_override_count=0
 +    rc_eq=
 +    maxrate=0
 +    minrate=0
 +    bufsize=0
 +    rc_buf_aggressivity=1.000000
 +    i_qfactor=-0.800000
 +    i_qoffset=0.000000
 +    rc_init_cplx=0.000000
 +    dct=0
 +    lumi_mask=0.000000
 +    tcplx_mask=0.000000
 +    scplx_mask=0.000000
 +    p_mask=0.000000
 +    dark_mask=0.000000
 +    idct=0
 +    slice_count=0
 +    ec=0x00000003
 +    bits_per_coded_sample=0
 +    pred=0
 +    aspect=2835/2835
 +    sar=2835/2835
 +    debug=0x00000000
 +    vismv=0x00000000
 +    cmp=0
 +    subcmp=0
 +    mbcmp=0
 +    ildctcmp=8
 +    dia_size=0
 +    last_pred=0
 +    preme=0
 +    precmp=0
 +    pre_dia_size=0
 +    subq=8
 +    dtg_active_format=0
 +    me_range=0
 +    ibias=999999
 +    pbias=999999
 +    global_quality=0
 +    coder=0
 +    context=0
 +    slice_flags=0
 +    xvmc_acceleration=0
 +    mbd=0
 +    stream_codec_tag=0
 +    sc_threshold=0
 +    lmin=0
 +    lmax=0
 +    nr=0
 +    rc_init_occupancy=0
 +    flags2=0x00000000
 +    error=0
 +    threads=1
 +    me_threshold=0
 +    mb_threshold=0
 +    dc=0
 +    nssew=8
 +    skip_top=0
 +    skip_bottom=0
 +    profile=-99
 +    level=-99
 +    lowres=0
 +    skip_threshold=0
 +    skip_factor=0
 +    skip_exp=0
 +    skipcmp=13
 +    border_mask=0.000000
 +    mblmin=236
 +    mblmax=3658
 +    mepc=256
 +    skip_loop_filter=0
 +    skip_idct=0
 +    skip_frame=0
 +    bidir_refine=1
 +    brd_scale=0
 +    keyint_min=25
 +    refs=1
 +    chromaoffset=0
 +    trellis=0
 +    sc_factor=6
 +    mv0_threshold=256
 +    b_sensitivity=40
 +    compression_level=-1
 +    min_prediction_order=-1
 +    max_prediction_order=-1
 +    timecode_frame_start=-1
 +    bits_per_raw_sample=0
 +    channel_layout=0
 +    request_channel_layout=0
 +    rc_max_vbv_use=0.000000
 +    rc_min_vbv_use=3.000000
 +    ticks_per_frame=1
 +    color_primaries=2
 +    color_trc=2
 +    colorspace=2
 +    color_range=2
 +    chroma_sample_location=0
 +    log_level_offset=0
 +    slices=0
 +    thread_type=0x00000003
 +    audio_service_type=0
 +    request_sample_fmt=none
 +    pkt_timebase=1/25
 +    sub_charenc=
 +    sub_charenc_mode=0x00000000
 +    sub_text_format=1
 +    refcounted_frames=false
 +    side_data_only_packets=true
++    apply_cropping=true
 +    skip_alpha=false
 +    field_order=0
 +    dump_separator=
 +    codec_whitelist=
 +    pixel_format=rgba
 +    video_size=128x128
 +    max_pixels=2147483647
 +stream=0, decode=1
 +    b=0
 +    ab=0
 +    bt=4000000
 +    flags=0x00000000
 +    me_method=5
 +    time_base=0/1
 +    g=12
 +    ar=0
 +    ac=0
 +    cutoff=0
 +    frame_size=0
 +    delay=0
 +    qcomp=0.500000
 +    qblur=0.500000
 +    qmin=2
 +    qmax=31
 +    qdiff=3
 +    bf=0
 +    b_qfactor=1.250000
 +    rc_strategy=0
 +    b_strategy=0
 +    ps=0
 +    mv_bits=0
 +    header_bits=0
 +    i_tex_bits=0
 +    p_tex_bits=0
 +    i_count=0
 +    p_count=0
 +    skip_count=0
 +    misc_bits=0
 +    frame_bits=0
 +    codec_tag=0
 +    bug=0x00000001
 +    strict=0
 +    b_qoffset=1.250000
 +    err_detect=0x00000000
 +    has_b_frames=0
 +    block_align=0
 +    mpeg_quant=0
 +    qsquish=0.000000
 +    rc_qmod_amp=0.000000
 +    rc_qmod_freq=0
 +    rc_override_count=0
 +    rc_eq=
 +    maxrate=0
 +    minrate=0
 +    bufsize=0
 +    rc_buf_aggressivity=1.000000
 +    i_qfactor=-0.800000
 +    i_qoffset=0.000000
 +    rc_init_cplx=0.000000
 +    dct=0
 +    lumi_mask=0.000000
 +    tcplx_mask=0.000000
 +    scplx_mask=0.000000
 +    p_mask=0.000000
 +    dark_mask=0.000000
 +    idct=0
 +    slice_count=0
 +    ec=0x00000003
 +    bits_per_coded_sample=0
 +    pred=0
 +    aspect=2835/2835
 +    sar=2835/2835
 +    debug=0x00000000
 +    vismv=0x00000000
 +    cmp=0
 +    subcmp=0
 +    mbcmp=0
 +    ildctcmp=8
 +    dia_size=0
 +    last_pred=0
 +    preme=0
 +    precmp=0
 +    pre_dia_size=0
 +    subq=8
 +    dtg_active_format=0
 +    me_range=0
 +    ibias=999999
 +    pbias=999999
 +    global_quality=0
 +    coder=0
 +    context=0
 +    slice_flags=0
 +    xvmc_acceleration=0
 +    mbd=0
 +    stream_codec_tag=0
 +    sc_threshold=0
 +    lmin=0
 +    lmax=0
 +    nr=0
 +    rc_init_occupancy=0
 +    flags2=0x00000000
 +    error=0
 +    threads=1
 +    me_threshold=0
 +    mb_threshold=0
 +    dc=0
 +    nssew=8
 +    skip_top=0
 +    skip_bottom=0
 +    profile=-99
 +    level=-99
 +    lowres=0
 +    skip_threshold=0
 +    skip_factor=0
 +    skip_exp=0
 +    skipcmp=13
 +    border_mask=0.000000
 +    mblmin=236
 +    mblmax=3658
 +    mepc=256
 +    skip_loop_filter=0
 +    skip_idct=0
 +    skip_frame=0
 +    bidir_refine=1
 +    brd_scale=0
 +    keyint_min=25
 +    refs=1
 +    chromaoffset=0
 +    trellis=0
 +    sc_factor=6
 +    mv0_threshold=256
 +    b_sensitivity=40
 +    compression_level=-1
 +    min_prediction_order=-1
 +    max_prediction_order=-1
 +    timecode_frame_start=-1
 +    bits_per_raw_sample=0
 +    channel_layout=0
 +    request_channel_layout=0
 +    rc_max_vbv_use=0.000000
 +    rc_min_vbv_use=3.000000
 +    ticks_per_frame=1
 +    color_primaries=2
 +    color_trc=2
 +    colorspace=2
 +    color_range=2
 +    chroma_sample_location=0
 +    log_level_offset=0
 +    slices=0
 +    thread_type=0x00000003
 +    audio_service_type=0
 +    request_sample_fmt=none
 +    pkt_timebase=1/25
 +    sub_charenc=
 +    sub_charenc_mode=0x00000000
 +    sub_text_format=1
 +    refcounted_frames=false
 +    side_data_only_packets=true
++    apply_cropping=true
 +    skip_alpha=false
 +    field_order=0
 +    dump_separator=
 +    codec_whitelist=
 +    pixel_format=rgba
 +    video_size=128x128
 +    max_pixels=2147483647