/*
 * This file is part of FFmpeg.
 *
 * FFmpeg 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.
 *
 * FFmpeg 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 FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include <limits.h>
#include <stddef.h>
#include <stdint.h>

#include "buffer.h"
#include "common.h"
#include "frame.h"
#include "mem.h"
#include "video_enc_params.h"

AVVideoEncParams *av_video_enc_params_alloc(enum AVVideoEncParamsType type,
                                            unsigned int nb_blocks, size_t *out_size)
{
    AVVideoEncParams *par;
    size_t size;

    size = sizeof(*par);
    if (nb_blocks > SIZE_MAX / sizeof(AVVideoBlockParams) ||
        nb_blocks * sizeof(AVVideoBlockParams) > SIZE_MAX - size)
        return NULL;
    size += sizeof(AVVideoBlockParams) * nb_blocks;

    par = av_mallocz(size);
    if (!par)
        return NULL;

    par->type          = type;
    par->nb_blocks     = nb_blocks;
    par->block_size    = sizeof(AVVideoBlockParams);
    par->blocks_offset = sizeof(*par);

    if (out_size)
        *out_size = size;

    return par;
}

AVVideoEncParams*
av_video_enc_params_create_side_data(AVFrame *frame, enum AVVideoEncParamsType type,
                                     unsigned int nb_blocks)
{
    AVBufferRef      *buf;
    AVVideoEncParams *par;
    size_t size;

    par = av_video_enc_params_alloc(type, nb_blocks, &size);
    if (!par)
        return NULL;
    buf = av_buffer_create((uint8_t *)par, size, NULL, NULL, 0);
    if (!buf) {
        av_freep(&par);
        return NULL;
    }

    if (!av_frame_new_side_data_from_buf(frame, AV_FRAME_DATA_VIDEO_ENC_PARAMS, buf)) {
        av_buffer_unref(&buf);
        return NULL;
    }

    return par;
}
