#include "ffcpp.h" #include "Frame.h" #include namespace ffcpp { Frame::Frame(): _buffer(nullptr) { _frame = av_frame_alloc(); } Frame::Frame(int size, int channels, AVSampleFormat sampleFormat, int sampleRate): Frame() { _frame->nb_samples = size; _frame->channels = channels; _frame->channel_layout = (uint64_t)av_get_default_channel_layout(channels); _frame->format = sampleFormat; _frame->sample_rate = sampleRate; int res = av_frame_get_buffer(_frame, 0); throwIfError(res, "cannot initialize buffer in audio frame"); } Frame::Frame(int width, int height, AVPixelFormat pixelFormat): Frame() { /* _frame->width = width; _frame->height = height; _frame->format = pixelFormat; int res = av_frame_get_buffer(_frame, 0); throwIfError(res, "cannot initialize buffer in video frame"); */ _frame->width = width; _frame->height = height; _frame->format = pixelFormat; int size = av_image_get_buffer_size(pixelFormat, width, height, 32); _buffer = (uint8_t*)av_malloc(size*sizeof(uint8_t)); int res = av_image_fill_arrays((uint8_t**)_frame->data, _frame->linesize, _buffer, pixelFormat, width, height, 32); throwIfError(res, "cannot initialize video frame"); } Frame::Frame(Frame &&frame) { *this = std::move(frame); } Frame::~Frame() { if(_buffer) { av_free(_buffer); } if(_frame) { av_frame_free(&_frame); } } Frame& Frame::operator=(Frame&& frame) { _frame = frame._frame; _buffer = frame._buffer; frame._frame = nullptr; frame._buffer = nullptr; return *this; } Frame::operator AVFrame*() { return _frame; } Frame::operator const AVFrame*() const { return _frame; } void Frame::guessPts() { _frame->pts = av_frame_get_best_effort_timestamp(_frame); } void Frame::setPictureType(AVPictureType type) { _frame->pict_type = type; } int Frame::samplesCount() const { return _frame->nb_samples; } void Frame::setPts(int pts) { _frame->pts = pts; } }