[FFmpeg-cvslog] lavc, lavu: move frame cropping to a convenience function

2017-11-08 Thread wm4
ffmpeg | branch: master | wm4  | Sat Jul 22 23:05:13 
2017 +0200| [47399ccdfd93d337c96c76fbf591f0e3637131ef] | committer: Anton 
Khirnov

lavc, lavu: move frame cropping to a convenience function

Signed-off-by: Anton Khirnov 

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=47399ccdfd93d337c96c76fbf591f0e3637131ef
---

 doc/APIchanges  |   3 ++
 libavcodec/decode.c |  89 ++
 libavutil/frame.c   | 100 
 libavutil/frame.h   |  34 ++
 libavutil/version.h |   2 +-
 5 files changed, 140 insertions(+), 88 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 0f7c839573..30a8f809d1 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil: 2017-03-23
 
 API changes, most recent first:
 
+2017-xx-xx - xxx - lavu 56.3.0 - frame.h
+  Add av_frame_apply_cropping().
+
 2017-xx-xx - xxx - lavc 58.4.0 - avcodec.h
   DXVA2 and D3D11 hardware accelerated decoding now supports the new hwaccel 
API,
   which can create the decoder context and allocate hardware frame 
automatically.
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 175a6fae4c..9644e89f48 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -446,44 +446,8 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext 
*avctx, const AVPacke
 return 0;
 }
 
-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 = >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   ||
@@ -504,57 +468,8 @@ static int apply_cropping(AVCodecContext *avctx, AVFrame 
*frame)
 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 log2_crop_align = frame->crop_left ? av_ctz(frame->crop_left) : 
INT_MAX;
-int min_log2_align = INT_MAX;
-
-for (i = 0; frame->data[i]; i++) {
-int log2_align = offsets[i] ? av_ctz(offsets[i]) : INT_MAX;
-min_log2_align = FFMIN(log2_align, min_log2_align);
-}
-
-/* we assume, and it should always be true, that the data alignment is
- * related to the cropping alignment by a constant power-of-2 factor */
-if (log2_crop_align < min_log2_align)
-return AVERROR_BUG;
-
-if (min_log2_align < 5) {
-frame->crop_left &= ~((1 << (5 + log2_crop_align - 
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;
+return av_frame_apply_cropping(frame, avctx->flags & 
AV_CODEC_FLAG_UNALIGNED ?

[FFmpeg-cvslog] lavc, lavu: move frame cropping to a convenience function

2017-08-08 Thread wm4
ffmpeg | branch: master | wm4  | Sat Jul 22 23:05:13 
2017 +0200| [caa12027baf1180453846c58da08fc87accc0ff6] | committer: wm4

lavc, lavu: move frame cropping to a convenience function

Signed-off-by: Anton Khirnov 

Merged from Libav commit 47399ccdfd.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=caa12027baf1180453846c58da08fc87accc0ff6
---

 doc/APIchanges  |   3 ++
 libavcodec/decode.c |  89 ++
 libavutil/frame.c   | 100 
 libavutil/frame.h   |  34 ++
 libavutil/version.h |   2 +-
 5 files changed, 140 insertions(+), 88 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 63fac21000..cd69ec7bc6 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,9 @@ libavutil: 2015-08-28
 
 API changes, most recent first:
 
+2017-08-08 - xxx - lavu 55.71.100 - frame.h
+  Add av_frame_apply_cropping().
+
 2017-07-25 - 24de4fddca - lavu 55.69.100 - frame.h
   Add AV_FRAME_DATA_ICC_PROFILE side data type.
 
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 052f93d82f..9b57910842 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -683,44 +683,8 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext 
*avctx, const AVPacke
 return 0;
 }
 
-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 = >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   ||
@@ -742,57 +706,8 @@ static int apply_cropping(AVCodecContext *avctx, AVFrame 
*frame)
 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 log2_crop_align = frame->crop_left ? ff_ctz(frame->crop_left) : 
INT_MAX;
-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);
-}
-
-/* we assume, and it should always be true, that the data alignment is
- * related to the cropping alignment by a constant power-of-2 factor */
-if (log2_crop_align < min_log2_align)
-return AVERROR_BUG;
-
-if (min_log2_align < 5) {
-frame->crop_left &= ~((1 << (5 + log2_crop_align - 
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;
+return av_frame_apply_cropping(frame, avctx->flags & 
AV_CODEC_FLAG_UNALIGNED ?
+  AV_FRAME_CROP_UNALIGNED : 0);
 }
 
 int