88 lines
1.9 KiB
C++
88 lines
1.9 KiB
C++
#include "ffcpp.h"
|
|
#include "Frame.h"
|
|
#include <stdexcept>
|
|
|
|
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;
|
|
}
|
|
|
|
}
|