Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
А еще лучше ffplay
(YUV->RGB, например конвертится в шейдере, бесплатный ресайз, кроп и т.д)
uint8_t *buff = new uint8_t(1920*3*2);
...
pFile = fopen(szFilename, "wb");
if (pFile == NULL)
return; // вот тут она и потечет
В состав ffmpeg входит библиотека swscale, которая позволяет конвертировать в разные цветовые пространства. Все функции там оптимизированы с использованием SSE
avformat_open_input(&input_ctx, filename, NULL, NULL
if (pFile == NULL)
return;
fwrite(buff, 1, 1920 * 3 * 2, pFile);
char szFilename[32];
void SaveFrame(uint8_t * f1, uint8_t * f2, int iFrame)
uint8_t *buff = new uint8_t(1920*3*2);
Перезаписывать 75 Мбайт в секунду серьезная задача для любого процессора
Итого 25.6 Гб/с
А зачем тогда нужен кеш 1,2 и 3 уровня???
Вывод: программное декодирование потока RTSP Full HD H.264 занимает до двух ядер Intel ATOM Z8350 к тому же периодически происходит потеря пакетов, из-за чего часть кадров декодировано неправильно. Данный способ более применим для декодирования записанных видео файлов, т. к. не нужна работа в реальном масштабе времени.
Я надеюсь, вы сейчас не всерьёз это сказали.
А по вашему на тактовой частоте процессора могу считывать и записывать 1 байт информации в основную память? Можете привести пример кода перезаписи 100 МБайт за 31*2 = 62 мс?
Можете привести пример кода перезаписи 100 МБайт за 31*2 = 62 мс?
#include <iostream>
#include <algorithm>
#include <chrono>
#include <vector>
using namespace std;
using namespace chrono;
// 1024 * 1024 elements;
static const size_t numElems = 1048576UL;
int main()
{
vector<int> src(numElems), dst(numElems);
vector<double> bandwidth;
const size_t vectorSize = src.size() * sizeof(src.front());
for (int numLaps = 0; numLaps < 1024; numLaps++) {
void* const source = src.data();
void* destination = dst.data();
auto start = system_clock::now();
memcpy(destination, source, vectorSize);
auto end = system_clock::now();
auto time = duration_cast<microseconds>(end - start).count();
auto bw = double(vectorSize) / double(time);
cout << bw << " megabytes / s" << endl;
bandwidth.push_back(bw);
}
double acc = 0;
for (auto bw : bandwidth) {
acc += bw;
}
acc = acc / bandwidth.size();
cout << "Avg bandwidth: " << acc << " megabytes / s" << endl;
return 0;
}ATOM с этой перезаписью плохо справляется (проверено на VLC). Для ускорения используются инструкции SSE4, как написано в статье.
FFmpeg практика аппаратного декодирования DXVA2