1/* 2 * Mpeg video formats-related picture management 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/avassert.h" 24#include "libavutil/common.h" 25#include "libavutil/pixdesc.h" 26#include "libavutil/imgutils.h" 27 28#include "avcodec.h" 29#include "encode.h" 30#include "motion_est.h" 31#include "mpegpicture.h" 32#include "mpegutils.h" 33#include "threadframe.h" 34 35static void av_noinline free_picture_tables(Picture *pic) 36{ 37 pic->alloc_mb_width = 38 pic->alloc_mb_height = 0; 39 40 av_buffer_unref(&pic->mb_var_buf); 41 av_buffer_unref(&pic->mc_mb_var_buf); 42 av_buffer_unref(&pic->mb_mean_buf); 43 av_buffer_unref(&pic->mbskip_table_buf); 44 av_buffer_unref(&pic->qscale_table_buf); 45 av_buffer_unref(&pic->mb_type_buf); 46 47 for (int i = 0; i < 2; i++) { 48 av_buffer_unref(&pic->motion_val_buf[i]); 49 av_buffer_unref(&pic->ref_index_buf[i]); 50 } 51} 52 53static int make_tables_writable(Picture *pic) 54{ 55 int ret, i; 56#define MAKE_WRITABLE(table) \ 57do {\ 58 if (pic->table &&\ 59 (ret = av_buffer_make_writable(&pic->table)) < 0)\ 60 return ret;\ 61} while (0) 62 63 MAKE_WRITABLE(mb_var_buf); 64 MAKE_WRITABLE(mc_mb_var_buf); 65 MAKE_WRITABLE(mb_mean_buf); 66 MAKE_WRITABLE(mbskip_table_buf); 67 MAKE_WRITABLE(qscale_table_buf); 68 MAKE_WRITABLE(mb_type_buf); 69 70 for (i = 0; i < 2; i++) { 71 MAKE_WRITABLE(motion_val_buf[i]); 72 MAKE_WRITABLE(ref_index_buf[i]); 73 } 74 75 return 0; 76} 77 78int ff_mpeg_framesize_alloc(AVCodecContext *avctx, MotionEstContext *me, 79 ScratchpadContext *sc, int linesize) 80{ 81# define EMU_EDGE_HEIGHT (4 * 70) 82 int alloc_size = FFALIGN(FFABS(linesize) + 64, 32); 83 84 if (avctx->hwaccel) 85 return 0; 86 87 if (linesize < 24) { 88 av_log(avctx, AV_LOG_ERROR, "Image too small, temporary buffers cannot function\n"); 89 return AVERROR_PATCHWELCOME; 90 } 91 92 if (av_image_check_size2(alloc_size, EMU_EDGE_HEIGHT, avctx->max_pixels, AV_PIX_FMT_NONE, 0, avctx) < 0) 93 return AVERROR(ENOMEM); 94 95 // edge emu needs blocksize + filter length - 1 96 // (= 17x17 for halfpel / 21x21 for H.264) 97 // VC-1 computes luma and chroma simultaneously and needs 19X19 + 9x9 98 // at uvlinesize. It supports only YUV420 so 24x24 is enough 99 // linesize * interlaced * MBsize 100 // we also use this buffer for encoding in encode_mb_internal() needig an additional 32 lines 101 if (!FF_ALLOCZ_TYPED_ARRAY(sc->edge_emu_buffer, alloc_size * EMU_EDGE_HEIGHT) || 102 !FF_ALLOCZ_TYPED_ARRAY(me->scratchpad, alloc_size * 4 * 16 * 2)) { 103 av_freep(&sc->edge_emu_buffer); 104 return AVERROR(ENOMEM); 105 } 106 107 me->temp = me->scratchpad; 108 sc->rd_scratchpad = me->scratchpad; 109 sc->b_scratchpad = me->scratchpad; 110 sc->obmc_scratchpad = me->scratchpad + 16; 111 112 return 0; 113} 114 115/** 116 * Allocate a frame buffer 117 */ 118static int alloc_frame_buffer(AVCodecContext *avctx, Picture *pic, 119 MotionEstContext *me, ScratchpadContext *sc, 120 int chroma_x_shift, int chroma_y_shift, 121 int linesize, int uvlinesize) 122{ 123 int edges_needed = av_codec_is_encoder(avctx->codec); 124 int r, ret; 125 126 pic->tf.f = pic->f; 127 128 if (edges_needed) { 129 pic->f->width = avctx->width + 2 * EDGE_WIDTH; 130 pic->f->height = avctx->height + 2 * EDGE_WIDTH; 131 132 r = ff_encode_alloc_frame(avctx, pic->f); 133 } else if (avctx->codec_id != AV_CODEC_ID_WMV3IMAGE && 134 avctx->codec_id != AV_CODEC_ID_VC1IMAGE && 135 avctx->codec_id != AV_CODEC_ID_MSS2) { 136 r = ff_thread_get_ext_buffer(avctx, &pic->tf, 137 pic->reference ? AV_GET_BUFFER_FLAG_REF : 0); 138 } else { 139 pic->f->width = avctx->width; 140 pic->f->height = avctx->height; 141 pic->f->format = avctx->pix_fmt; 142 r = avcodec_default_get_buffer2(avctx, pic->f, 0); 143 } 144 145 if (r < 0 || !pic->f->buf[0]) { 146 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed (%d %p)\n", 147 r, pic->f->data[0]); 148 return -1; 149 } 150 151 if (edges_needed) { 152 int i; 153 for (i = 0; pic->f->data[i]; i++) { 154 int offset = (EDGE_WIDTH >> (i ? chroma_y_shift : 0)) * 155 pic->f->linesize[i] + 156 (EDGE_WIDTH >> (i ? chroma_x_shift : 0)); 157 pic->f->data[i] += offset; 158 } 159 pic->f->width = avctx->width; 160 pic->f->height = avctx->height; 161 } 162 163 if (avctx->hwaccel) { 164 assert(!pic->hwaccel_picture_private); 165 if (avctx->hwaccel->frame_priv_data_size) { 166 pic->hwaccel_priv_buf = av_buffer_allocz(avctx->hwaccel->frame_priv_data_size); 167 if (!pic->hwaccel_priv_buf) { 168 av_log(avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n"); 169 return -1; 170 } 171 pic->hwaccel_picture_private = pic->hwaccel_priv_buf->data; 172 } 173 } 174 175 if ((linesize && linesize != pic->f->linesize[0]) || 176 (uvlinesize && uvlinesize != pic->f->linesize[1])) { 177 av_log(avctx, AV_LOG_ERROR, 178 "get_buffer() failed (stride changed: linesize=%d/%d uvlinesize=%d/%d)\n", 179 linesize, pic->f->linesize[0], 180 uvlinesize, pic->f->linesize[1]); 181 ff_mpeg_unref_picture(avctx, pic); 182 return -1; 183 } 184 185 if (av_pix_fmt_count_planes(pic->f->format) > 2 && 186 pic->f->linesize[1] != pic->f->linesize[2]) { 187 av_log(avctx, AV_LOG_ERROR, 188 "get_buffer() failed (uv stride mismatch)\n"); 189 ff_mpeg_unref_picture(avctx, pic); 190 return -1; 191 } 192 193 if (!sc->edge_emu_buffer && 194 (ret = ff_mpeg_framesize_alloc(avctx, me, sc, 195 pic->f->linesize[0])) < 0) { 196 av_log(avctx, AV_LOG_ERROR, 197 "get_buffer() failed to allocate context scratch buffers.\n"); 198 ff_mpeg_unref_picture(avctx, pic); 199 return ret; 200 } 201 202 return 0; 203} 204 205static int alloc_picture_tables(AVCodecContext *avctx, Picture *pic, int encoding, int out_format, 206 int mb_stride, int mb_width, int mb_height, int b8_stride) 207{ 208 const int big_mb_num = mb_stride * (mb_height + 1) + 1; 209 const int mb_array_size = mb_stride * mb_height; 210 const int b8_array_size = b8_stride * mb_height * 2; 211 int i; 212 213 214 pic->mbskip_table_buf = av_buffer_allocz(mb_array_size + 2); 215 pic->qscale_table_buf = av_buffer_allocz(big_mb_num + mb_stride); 216 pic->mb_type_buf = av_buffer_allocz((big_mb_num + mb_stride) * 217 sizeof(uint32_t)); 218 if (!pic->mbskip_table_buf || !pic->qscale_table_buf || !pic->mb_type_buf) 219 return AVERROR(ENOMEM); 220 221 if (encoding) { 222 pic->mb_var_buf = av_buffer_allocz(mb_array_size * sizeof(int16_t)); 223 pic->mc_mb_var_buf = av_buffer_allocz(mb_array_size * sizeof(int16_t)); 224 pic->mb_mean_buf = av_buffer_allocz(mb_array_size); 225 if (!pic->mb_var_buf || !pic->mc_mb_var_buf || !pic->mb_mean_buf) 226 return AVERROR(ENOMEM); 227 } 228 229 if (out_format == FMT_H263 || encoding || 230 (avctx->export_side_data & AV_CODEC_EXPORT_DATA_MVS)) { 231 int mv_size = 2 * (b8_array_size + 4) * sizeof(int16_t); 232 int ref_index_size = 4 * mb_array_size; 233 234 for (i = 0; mv_size && i < 2; i++) { 235 pic->motion_val_buf[i] = av_buffer_allocz(mv_size); 236 pic->ref_index_buf[i] = av_buffer_allocz(ref_index_size); 237 if (!pic->motion_val_buf[i] || !pic->ref_index_buf[i]) 238 return AVERROR(ENOMEM); 239 } 240 } 241 242 pic->alloc_mb_width = mb_width; 243 pic->alloc_mb_height = mb_height; 244 pic->alloc_mb_stride = mb_stride; 245 246 return 0; 247} 248 249/** 250 * Allocate a Picture. 251 * The pixels are allocated/set by calling get_buffer() if shared = 0 252 */ 253int ff_alloc_picture(AVCodecContext *avctx, Picture *pic, MotionEstContext *me, 254 ScratchpadContext *sc, int shared, int encoding, 255 int chroma_x_shift, int chroma_y_shift, int out_format, 256 int mb_stride, int mb_width, int mb_height, int b8_stride, 257 ptrdiff_t *linesize, ptrdiff_t *uvlinesize) 258{ 259 int i, ret; 260 261 if (pic->qscale_table_buf) 262 if ( pic->alloc_mb_width != mb_width 263 || pic->alloc_mb_height != mb_height) 264 free_picture_tables(pic); 265 266 if (shared) { 267 av_assert0(pic->f->data[0]); 268 pic->shared = 1; 269 } else { 270 av_assert0(!pic->f->buf[0]); 271 if (alloc_frame_buffer(avctx, pic, me, sc, 272 chroma_x_shift, chroma_y_shift, 273 *linesize, *uvlinesize) < 0) 274 return -1; 275 276 *linesize = pic->f->linesize[0]; 277 *uvlinesize = pic->f->linesize[1]; 278 } 279 280 if (!pic->qscale_table_buf) 281 ret = alloc_picture_tables(avctx, pic, encoding, out_format, 282 mb_stride, mb_width, mb_height, b8_stride); 283 else 284 ret = make_tables_writable(pic); 285 if (ret < 0) 286 goto fail; 287 288 if (encoding) { 289 pic->mb_var = (uint16_t*)pic->mb_var_buf->data; 290 pic->mc_mb_var = (uint16_t*)pic->mc_mb_var_buf->data; 291 pic->mb_mean = pic->mb_mean_buf->data; 292 } 293 294 pic->mbskip_table = pic->mbskip_table_buf->data; 295 pic->qscale_table = pic->qscale_table_buf->data + 2 * mb_stride + 1; 296 pic->mb_type = (uint32_t*)pic->mb_type_buf->data + 2 * mb_stride + 1; 297 298 if (pic->motion_val_buf[0]) { 299 for (i = 0; i < 2; i++) { 300 pic->motion_val[i] = (int16_t (*)[2])pic->motion_val_buf[i]->data + 4; 301 pic->ref_index[i] = pic->ref_index_buf[i]->data; 302 } 303 } 304 305 return 0; 306fail: 307 av_log(avctx, AV_LOG_ERROR, "Error allocating a picture.\n"); 308 ff_mpeg_unref_picture(avctx, pic); 309 free_picture_tables(pic); 310 return AVERROR(ENOMEM); 311} 312 313/** 314 * Deallocate a picture; frees the picture tables in case they 315 * need to be reallocated anyway. 316 */ 317void ff_mpeg_unref_picture(AVCodecContext *avctx, Picture *pic) 318{ 319 int off = offsetof(Picture, mb_mean) + sizeof(pic->mb_mean); 320 321 pic->tf.f = pic->f; 322 /* WM Image / Screen codecs allocate internal buffers with different 323 * dimensions / colorspaces; ignore user-defined callbacks for these. */ 324 if (avctx->codec_id != AV_CODEC_ID_WMV3IMAGE && 325 avctx->codec_id != AV_CODEC_ID_VC1IMAGE && 326 avctx->codec_id != AV_CODEC_ID_MSS2) 327 ff_thread_release_ext_buffer(avctx, &pic->tf); 328 else if (pic->f) 329 av_frame_unref(pic->f); 330 331 av_buffer_unref(&pic->hwaccel_priv_buf); 332 333 if (pic->needs_realloc) 334 free_picture_tables(pic); 335 336 memset((uint8_t*)pic + off, 0, sizeof(*pic) - off); 337} 338 339int ff_update_picture_tables(Picture *dst, const Picture *src) 340{ 341 int i, ret; 342 343 ret = av_buffer_replace(&dst->mb_var_buf, src->mb_var_buf); 344 ret |= av_buffer_replace(&dst->mc_mb_var_buf, src->mc_mb_var_buf); 345 ret |= av_buffer_replace(&dst->mb_mean_buf, src->mb_mean_buf); 346 ret |= av_buffer_replace(&dst->mbskip_table_buf, src->mbskip_table_buf); 347 ret |= av_buffer_replace(&dst->qscale_table_buf, src->qscale_table_buf); 348 ret |= av_buffer_replace(&dst->mb_type_buf, src->mb_type_buf); 349 for (i = 0; i < 2; i++) { 350 ret |= av_buffer_replace(&dst->motion_val_buf[i], src->motion_val_buf[i]); 351 ret |= av_buffer_replace(&dst->ref_index_buf[i], src->ref_index_buf[i]); 352 } 353 354 if (ret < 0) { 355 free_picture_tables(dst); 356 return ret; 357 } 358 359 dst->mb_var = src->mb_var; 360 dst->mc_mb_var = src->mc_mb_var; 361 dst->mb_mean = src->mb_mean; 362 dst->mbskip_table = src->mbskip_table; 363 dst->qscale_table = src->qscale_table; 364 dst->mb_type = src->mb_type; 365 for (i = 0; i < 2; i++) { 366 dst->motion_val[i] = src->motion_val[i]; 367 dst->ref_index[i] = src->ref_index[i]; 368 } 369 370 dst->alloc_mb_width = src->alloc_mb_width; 371 dst->alloc_mb_height = src->alloc_mb_height; 372 dst->alloc_mb_stride = src->alloc_mb_stride; 373 374 return 0; 375} 376 377int ff_mpeg_ref_picture(AVCodecContext *avctx, Picture *dst, Picture *src) 378{ 379 int ret; 380 381 av_assert0(!dst->f->buf[0]); 382 av_assert0(src->f->buf[0]); 383 384 src->tf.f = src->f; 385 dst->tf.f = dst->f; 386 ret = ff_thread_ref_frame(&dst->tf, &src->tf); 387 if (ret < 0) 388 goto fail; 389 390 ret = ff_update_picture_tables(dst, src); 391 if (ret < 0) 392 goto fail; 393 394 if (src->hwaccel_picture_private) { 395 dst->hwaccel_priv_buf = av_buffer_ref(src->hwaccel_priv_buf); 396 if (!dst->hwaccel_priv_buf) { 397 ret = AVERROR(ENOMEM); 398 goto fail; 399 } 400 dst->hwaccel_picture_private = dst->hwaccel_priv_buf->data; 401 } 402 403 dst->field_picture = src->field_picture; 404 dst->mb_var_sum = src->mb_var_sum; 405 dst->mc_mb_var_sum = src->mc_mb_var_sum; 406 dst->b_frame_score = src->b_frame_score; 407 dst->needs_realloc = src->needs_realloc; 408 dst->reference = src->reference; 409 dst->shared = src->shared; 410 411 memcpy(dst->encoding_error, src->encoding_error, 412 sizeof(dst->encoding_error)); 413 414 return 0; 415fail: 416 ff_mpeg_unref_picture(avctx, dst); 417 return ret; 418} 419 420static inline int pic_is_unused(Picture *pic) 421{ 422 if (!pic->f->buf[0]) 423 return 1; 424 if (pic->needs_realloc) 425 return 1; 426 return 0; 427} 428 429static int find_unused_picture(AVCodecContext *avctx, Picture *picture, int shared) 430{ 431 int i; 432 433 if (shared) { 434 for (i = 0; i < MAX_PICTURE_COUNT; i++) { 435 if (!picture[i].f->buf[0]) 436 return i; 437 } 438 } else { 439 for (i = 0; i < MAX_PICTURE_COUNT; i++) { 440 if (pic_is_unused(&picture[i])) 441 return i; 442 } 443 } 444 445 av_log(avctx, AV_LOG_FATAL, 446 "Internal error, picture buffer overflow\n"); 447 /* We could return -1, but the codec would crash trying to draw into a 448 * non-existing frame anyway. This is safer than waiting for a random crash. 449 * Also the return of this is never useful, an encoder must only allocate 450 * as much as allowed in the specification. This has no relationship to how 451 * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large 452 * enough for such valid streams). 453 * Plus, a decoder has to check stream validity and remove frames if too 454 * many reference frames are around. Waiting for "OOM" is not correct at 455 * all. Similarly, missing reference frames have to be replaced by 456 * interpolated/MC frames, anything else is a bug in the codec ... 457 */ 458 abort(); 459 return -1; 460} 461 462int ff_find_unused_picture(AVCodecContext *avctx, Picture *picture, int shared) 463{ 464 int ret = find_unused_picture(avctx, picture, shared); 465 466 if (ret >= 0 && ret < MAX_PICTURE_COUNT) { 467 if (picture[ret].needs_realloc) { 468 ff_mpeg_unref_picture(avctx, &picture[ret]); 469 } 470 } 471 return ret; 472} 473 474void av_cold ff_mpv_picture_free(AVCodecContext *avctx, Picture *pic) 475{ 476 free_picture_tables(pic); 477 ff_mpeg_unref_picture(avctx, pic); 478 av_frame_free(&pic->f); 479} 480