[FFmpeg-cvslog] lavc, lavu: move frame cropping to a convenience function
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
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