From be039278b5ebd8075d90a3508db2aed5adf59e02 Mon Sep 17 00:00:00 2001 From: Vittorio Giovara Date: Wed, 12 Mar 2014 10:18:54 +0100 Subject: [PATCH] mpegvideo: move ff_draw_horiz_band() to mpegutils.c Drop the mpegvideo dependency for svq3 in configure. --- configure | 2 +- libavcodec/Makefile | 5 +-- libavcodec/mpegutils.c | 80 ++++++++++++++++++++++++++++++++++++++++++ libavcodec/mpegutils.h | 16 +++++++++ libavcodec/mpegvideo.c | 53 ---------------------------- libavcodec/mpegvideo.h | 3 -- 6 files changed, 100 insertions(+), 59 deletions(-) create mode 100644 libavcodec/mpegutils.c diff --git a/configure b/configure index ecccd21b07..b687790af0 100755 --- a/configure +++ b/configure @@ -1820,7 +1820,7 @@ sipr_decoder_select="lsp" sp5x_decoder_select="mjpeg_decoder" svq1_decoder_select="hpeldsp" svq1_encoder_select="aandcttables dsputil hpeldsp mpegvideoenc" -svq3_decoder_select="h264_decoder hpeldsp mpegvideo" +svq3_decoder_select="h264_decoder hpeldsp" svq3_decoder_suggest="zlib" tak_decoder_select="dsputil" theora_decoder_select="vp3_decoder" diff --git a/libavcodec/Makefile b/libavcodec/Makefile index bd93a6f578..c04b3f1294 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -57,7 +57,8 @@ OBJS-$(CONFIG_MPEGAUDIODSP) += mpegaudiodsp.o \ mpegaudiodsp_data.o \ mpegaudiodsp_fixed.o \ mpegaudiodsp_float.o -OBJS-$(CONFIG_MPEGVIDEO) += mpegvideo.o mpegvideo_motion.o +OBJS-$(CONFIG_MPEGVIDEO) += mpegvideo.o mpegvideo_motion.o \ + mpegutils.o OBJS-$(CONFIG_MPEGVIDEOENC) += mpegvideo_enc.o mpeg12data.o \ motion_est.o ratecontrol.o OBJS-$(CONFIG_RANGECODER) += rangecoder.o @@ -335,7 +336,7 @@ OBJS-$(CONFIG_SUNRAST_ENCODER) += sunrastenc.o OBJS-$(CONFIG_SVQ1_DECODER) += svq1dec.o svq1.o svq13.o h263.o OBJS-$(CONFIG_SVQ1_ENCODER) += svq1enc.o svq1.o \ h263.o ituh263enc.o -OBJS-$(CONFIG_SVQ3_DECODER) += svq3.o svq13.o +OBJS-$(CONFIG_SVQ3_DECODER) += svq3.o svq13.o mpegutils.o OBJS-$(CONFIG_TAK_DECODER) += takdec.o tak.o OBJS-$(CONFIG_TARGA_DECODER) += targa.o OBJS-$(CONFIG_TARGA_ENCODER) += targaenc.o rle.o diff --git a/libavcodec/mpegutils.c b/libavcodec/mpegutils.c new file mode 100644 index 0000000000..bc430f0531 --- /dev/null +++ b/libavcodec/mpegutils.c @@ -0,0 +1,80 @@ +/* + * Mpeg video formats-related defines and utility functions + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "libavutil/common.h" +#include "libavutil/frame.h" +#include "libavutil/pixdesc.h" + +#include "avcodec.h" +#include "mpegutils.h" + +void ff_draw_horiz_band(AVCodecContext *avctx, + AVFrame *cur, AVFrame *last, + int y, int h, int picture_structure, + int first_field, int low_delay) +{ + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt); + int vshift = desc->log2_chroma_h; + const int field_pic = picture_structure != PICT_FRAME; + if (field_pic) { + h <<= 1; + y <<= 1; + } + + h = FFMIN(h, avctx->height - y); + + if (field_pic && first_field && + !(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD)) + return; + + if (avctx->draw_horiz_band) { + AVFrame *src; + int offset[AV_NUM_DATA_POINTERS]; + int i; + + if (cur->pict_type == AV_PICTURE_TYPE_B || low_delay || + (avctx->slice_flags & SLICE_FLAG_CODED_ORDER)) + src = cur; + else if (last) + src = last; + else + return; + + if (cur->pict_type == AV_PICTURE_TYPE_B && + picture_structure == PICT_FRAME && + avctx->codec_id != AV_CODEC_ID_SVQ3) { + for (i = 0; i < AV_NUM_DATA_POINTERS; i++) + offset[i] = 0; + } else { + offset[0]= y * src->linesize[0]; + offset[1]= + offset[2]= (y >> vshift) * src->linesize[1]; + for (i = 3; i < AV_NUM_DATA_POINTERS; i++) + offset[i] = 0; + } + + emms_c(); + + avctx->draw_horiz_band(avctx, src, offset, + y, picture_structure, h); + } +} diff --git a/libavcodec/mpegutils.h b/libavcodec/mpegutils.h index 05a5fc202c..9446724f30 100644 --- a/libavcodec/mpegutils.h +++ b/libavcodec/mpegutils.h @@ -21,8 +21,14 @@ #ifndef AVCODEC_MPEGUTILS_H #define AVCODEC_MPEGUTILS_H +#include + +#include "libavutil/frame.h" + +#include "avcodec.h" #include "version.h" + /* picture type */ #define PICT_TOP_FIELD 1 #define PICT_BOTTOM_FIELD 2 @@ -108,4 +114,14 @@ #define CANDIDATE_MB_TYPE_DIRECT0 (1 << 12) + +/** + * Draw a horizontal band if supported. + * + * @param h is the normal height, this will be reduced automatically if needed + */ +void ff_draw_horiz_band(AVCodecContext *avctx, AVFrame *cur, AVFrame *last, + int y, int h, int picture_structure, int first_field, + int low_delay); + #endif /* AVCODEC_PICTTYPE_H */ diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index a6e326cb0c..854fd4ceee 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -2311,59 +2311,6 @@ void ff_MPV_decode_mb(MpegEncContext *s, int16_t block[12][64]){ MPV_decode_mb_internal(s, block, 0); } -/** - * @param h is the normal height, this will be reduced automatically if needed for the last row - */ -void ff_draw_horiz_band(AVCodecContext *avctx, - AVFrame *cur, AVFrame *last, - int y, int h, int picture_structure, - int first_field, int low_delay) -{ - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt); - int vshift = desc->log2_chroma_h; - const int field_pic = picture_structure != PICT_FRAME; - if(field_pic){ - h <<= 1; - y <<= 1; - } - - h = FFMIN(h, avctx->height - y); - - if(field_pic && first_field && !(avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return; - - if (avctx->draw_horiz_band) { - AVFrame *src; - int offset[AV_NUM_DATA_POINTERS]; - int i; - - if (cur->pict_type == AV_PICTURE_TYPE_B || low_delay || - (avctx->slice_flags & SLICE_FLAG_CODED_ORDER)) - src = cur; - else if (last) - src = last; - else - return; - - if (cur->pict_type == AV_PICTURE_TYPE_B && - picture_structure == PICT_FRAME && - avctx->codec_id != AV_CODEC_ID_SVQ3) { - for (i = 0; i < AV_NUM_DATA_POINTERS; i++) - offset[i] = 0; - }else{ - offset[0]= y * src->linesize[0]; - offset[1]= - offset[2]= (y >> vshift) * src->linesize[1]; - for (i = 3; i < AV_NUM_DATA_POINTERS; i++) - offset[i] = 0; - } - - emms_c(); - - avctx->draw_horiz_band(avctx, src, offset, - y, picture_structure, h); - } -} - void ff_mpeg_draw_horiz_band(MpegEncContext *s, int y, int h) { ff_draw_horiz_band(s->avctx, &s->current_picture.f, diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index f4d21973da..16e2c9ef6e 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -710,9 +710,6 @@ void ff_MPV_common_init_x86(MpegEncContext *s); void ff_MPV_common_init_arm(MpegEncContext *s); void ff_MPV_common_init_ppc(MpegEncContext *s); void ff_clean_intra_table_entries(MpegEncContext *s); -void ff_draw_horiz_band(AVCodecContext *avctx, AVFrame *cur, AVFrame *last, - int y, int h, int picture_structure, int first_field, - int low_delay); void ff_mpeg_draw_horiz_band(MpegEncContext *s, int y, int h); void ff_mpeg_flush(AVCodecContext *avctx); void ff_print_debug_info(MpegEncContext *s, Picture *p);