1/* 2 * Mpeg video formats-related defines and utility functions 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#include <stdint.h> 22 23#include "libavutil/common.h" 24#include "libavutil/frame.h" 25#include "libavutil/pixdesc.h" 26 27#include "avcodec.h" 28#include "mpegutils.h" 29 30void ff_draw_horiz_band(AVCodecContext *avctx, 31 AVFrame *cur, AVFrame *last, 32 int y, int h, int picture_structure, 33 int first_field, int low_delay) 34{ 35 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt); 36 int vshift = desc->log2_chroma_h; 37 const int field_pic = picture_structure != PICT_FRAME; 38 if (field_pic) { 39 h <<= 1; 40 y <<= 1; 41 } 42 43 h = FFMIN(h, avctx->height - y); 44 45 if (field_pic && first_field && 46 !(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD)) 47 return; 48 49 if (avctx->draw_horiz_band) { 50 AVFrame *src; 51 int offset[AV_NUM_DATA_POINTERS]; 52 int i; 53 54 if (cur->pict_type == AV_PICTURE_TYPE_B || low_delay || 55 (avctx->slice_flags & SLICE_FLAG_CODED_ORDER)) 56 src = cur; 57 else if (last) 58 src = last; 59 else 60 return; 61 62 if (cur->pict_type == AV_PICTURE_TYPE_B && 63 picture_structure == PICT_FRAME && 64 avctx->codec_id != AV_CODEC_ID_SVQ3) { 65 for (i = 0; i < AV_NUM_DATA_POINTERS; i++) 66 offset[i] = 0; 67 } else { 68 offset[0]= y * src->linesize[0]; 69 offset[1]= 70 offset[2]= (y >> vshift) * src->linesize[1]; 71 for (i = 3; i < AV_NUM_DATA_POINTERS; i++) 72 offset[i] = 0; 73 } 74 75 emms_c(); 76 77 avctx->draw_horiz_band(avctx, src, offset, 78 y, picture_structure, h); 79 } 80} 81