diff options
Diffstat (limited to 'third_party/aom/examples')
20 files changed, 0 insertions, 5553 deletions
diff --git a/third_party/aom/examples/analyzer.cc b/third_party/aom/examples/analyzer.cc deleted file mode 100644 index 6a42eca24..000000000 --- a/third_party/aom/examples/analyzer.cc +++ /dev/null @@ -1,723 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#include <wx/wx.h> -#include <wx/aboutdlg.h> -#include <wx/cmdline.h> -#include <wx/dcbuffer.h> - -#include "aom/aom_decoder.h" -#include "aom/aomdx.h" -#include "av1/common/onyxc_int.h" -#include "av1/decoder/accounting.h" -#include "av1/decoder/inspection.h" -#include "common/tools_common.h" -#include "common/video_reader.h" - -#define OD_SIGNMASK(a) (-((a) < 0)) -#define OD_FLIPSIGNI(a, b) (((a) + OD_SIGNMASK(b)) ^ OD_SIGNMASK(b)) -#define OD_DIV_ROUND(x, y) (((x) + OD_FLIPSIGNI((y) >> 1, x)) / (y)) - -enum { - OD_LUMA_MASK = 1 << 0, - OD_CB_MASK = 1 << 1, - OD_CR_MASK = 1 << 2, - OD_ALL_MASK = OD_LUMA_MASK | OD_CB_MASK | OD_CR_MASK -}; - -class AV1Decoder { - private: - FILE *input; - wxString path; - - AvxVideoReader *reader; - const AvxVideoInfo *info; - const AvxInterface *decoder; - - insp_frame_data frame_data; - - aom_codec_ctx_t codec; - bool show_padding; - - public: - aom_image_t *image; - int frame; - - int plane_mask; - - AV1Decoder(); - ~AV1Decoder(); - - bool open(const wxString &path); - void close(); - bool step(); - - int getWidthPadding() const; - int getHeightPadding() const; - void togglePadding(); - int getWidth() const; - int getHeight() const; - - bool getAccountingStruct(Accounting **acct); - bool setInspectionCallback(); - - static void inspect(void *decoder, void *data); -}; - -AV1Decoder::AV1Decoder() - : reader(NULL), info(NULL), decoder(NULL), show_padding(false), image(NULL), - frame(0) {} - -AV1Decoder::~AV1Decoder() {} - -void AV1Decoder::togglePadding() { show_padding = !show_padding; } - -bool AV1Decoder::open(const wxString &path) { - reader = aom_video_reader_open(path.mb_str()); - if (!reader) { - fprintf(stderr, "Failed to open %s for reading.", path.mb_str().data()); - return false; - } - this->path = path; - info = aom_video_reader_get_info(reader); - decoder = get_aom_decoder_by_fourcc(info->codec_fourcc); - if (!decoder) { - fprintf(stderr, "Unknown input codec."); - return false; - } - printf("Using %s\n", aom_codec_iface_name(decoder->codec_interface())); - if (aom_codec_dec_init(&codec, decoder->codec_interface(), NULL, 0)) { - fprintf(stderr, "Failed to initialize decoder."); - return false; - } - ifd_init(&frame_data, info->frame_width, info->frame_height); - setInspectionCallback(); - return true; -} - -void AV1Decoder::close() {} - -bool AV1Decoder::step() { - if (aom_video_reader_read_frame(reader)) { - size_t frame_size; - const unsigned char *frame_data; - frame_data = aom_video_reader_get_frame(reader, &frame_size); - if (aom_codec_decode(&codec, frame_data, frame_size, NULL)) { - fprintf(stderr, "Failed to decode frame."); - return false; - } else { - aom_codec_iter_t iter = NULL; - image = aom_codec_get_frame(&codec, &iter); - if (image != NULL) { - frame++; - return true; - } - return false; - } - } - return false; -} - -int AV1Decoder::getWidth() const { - return info->frame_width + 2 * getWidthPadding(); -} - -int AV1Decoder::getWidthPadding() const { - return show_padding ? AOMMAX(info->frame_width + 16, - ALIGN_POWER_OF_TWO(info->frame_width, 6)) - - info->frame_width - : 0; -} - -int AV1Decoder::getHeight() const { - return info->frame_height + 2 * getHeightPadding(); -} - -int AV1Decoder::getHeightPadding() const { - return show_padding ? AOMMAX(info->frame_height + 16, - ALIGN_POWER_OF_TWO(info->frame_height, 6)) - - info->frame_height - : 0; -} - -bool AV1Decoder::getAccountingStruct(Accounting **accounting) { - return aom_codec_control(&codec, AV1_GET_ACCOUNTING, accounting) == - AOM_CODEC_OK; -} - -bool AV1Decoder::setInspectionCallback() { - aom_inspect_init ii; - ii.inspect_cb = AV1Decoder::inspect; - ii.inspect_ctx = (void *)this; - return aom_codec_control(&codec, AV1_SET_INSPECTION_CALLBACK, &ii) == - AOM_CODEC_OK; -} - -void AV1Decoder::inspect(void *pbi, void *data) { - AV1Decoder *decoder = (AV1Decoder *)data; - ifd_inspect(&decoder->frame_data, pbi); -} - -#define MIN_ZOOM (1) -#define MAX_ZOOM (4) - -class AnalyzerPanel : public wxPanel { - DECLARE_EVENT_TABLE() - - private: - AV1Decoder decoder; - const wxString path; - - int zoom; - unsigned char *pixels; - - const bool bit_accounting; - double *bpp_q3; - - int plane_mask; - - // The display size is the decode size, scaled by the zoom. - int getDisplayWidth() const; - int getDisplayHeight() const; - - bool updateDisplaySize(); - - void computeBitsPerPixel(); - - public: - AnalyzerPanel(wxWindow *parent, const wxString &path, - const bool bit_accounting); - ~AnalyzerPanel(); - - bool open(const wxString &path); - void close(); - void render(); - void togglePadding(); - bool nextFrame(); - void refresh(); - - int getZoom() const; - bool setZoom(int zoom); - - void setShowPlane(bool show_plane, int mask); - - void onPaint(wxPaintEvent &event); // NOLINT -}; - -BEGIN_EVENT_TABLE(AnalyzerPanel, wxPanel) -EVT_PAINT(AnalyzerPanel::onPaint) -END_EVENT_TABLE() - -AnalyzerPanel::AnalyzerPanel(wxWindow *parent, const wxString &path, - const bool bit_accounting) - : wxPanel(parent), path(path), zoom(0), pixels(NULL), - bit_accounting(bit_accounting), bpp_q3(NULL), plane_mask(OD_ALL_MASK) {} - -AnalyzerPanel::~AnalyzerPanel() { close(); } - -void AnalyzerPanel::setShowPlane(bool show_plane, int mask) { - if (show_plane) { - plane_mask |= mask; - } else { - plane_mask &= ~mask; - } -} - -void AnalyzerPanel::render() { - aom_image_t *img = decoder.image; - const int hbd = !!(img->fmt & AOM_IMG_FMT_HIGHBITDEPTH); - int y_stride = img->stride[0] >> hbd; - int cb_stride = img->stride[1] >> hbd; - int cr_stride = img->stride[2] >> hbd; - int p_stride = 3 * getDisplayWidth(); - unsigned char *y_row = img->planes[0]; - unsigned char *cb_row = img->planes[1]; - unsigned char *cr_row = img->planes[2]; - uint16_t *y_row16 = reinterpret_cast<uint16_t *>(y_row); - uint16_t *cb_row16 = reinterpret_cast<uint16_t *>(cb_row); - uint16_t *cr_row16 = reinterpret_cast<uint16_t *>(cr_row); - unsigned char *p_row = pixels; - int y_width_padding = decoder.getWidthPadding(); - int cb_width_padding = y_width_padding >> 1; - int cr_width_padding = y_width_padding >> 1; - int y_height_padding = decoder.getHeightPadding(); - int cb_height_padding = y_height_padding >> 1; - int cr_height_padding = y_height_padding >> 1; - for (int j = 0; j < decoder.getHeight(); j++) { - unsigned char *y = y_row - y_stride * y_height_padding; - unsigned char *cb = cb_row - cb_stride * cb_height_padding; - unsigned char *cr = cr_row - cr_stride * cr_height_padding; - uint16_t *y16 = y_row16 - y_stride * y_height_padding; - uint16_t *cb16 = cb_row16 - cb_stride * cb_height_padding; - uint16_t *cr16 = cr_row16 - cr_stride * cr_height_padding; - unsigned char *p = p_row; - for (int i = 0; i < decoder.getWidth(); i++) { - int64_t yval; - int64_t cbval; - int64_t crval; - int pmask; - unsigned rval; - unsigned gval; - unsigned bval; - if (hbd) { - yval = *(y16 - y_width_padding); - cbval = *(cb16 - cb_width_padding); - crval = *(cr16 - cr_width_padding); - } else { - yval = *(y - y_width_padding); - cbval = *(cb - cb_width_padding); - crval = *(cr - cr_width_padding); - } - pmask = plane_mask; - if (pmask & OD_LUMA_MASK) { - yval -= 16; - } else { - yval = 128; - } - cbval = ((pmask & OD_CB_MASK) >> 1) * (cbval - 128); - crval = ((pmask & OD_CR_MASK) >> 2) * (crval - 128); - /*This is intentionally slow and very accurate.*/ - rval = OD_CLAMPI( - 0, - (int32_t)OD_DIV_ROUND( - 2916394880000LL * yval + 4490222169144LL * crval, 9745792000LL), - 65535); - gval = OD_CLAMPI(0, - (int32_t)OD_DIV_ROUND(2916394880000LL * yval - - 534117096223LL * cbval - - 1334761232047LL * crval, - 9745792000LL), - 65535); - bval = OD_CLAMPI( - 0, - (int32_t)OD_DIV_ROUND( - 2916394880000LL * yval + 5290866304968LL * cbval, 9745792000LL), - 65535); - unsigned char *px_row = p; - for (int v = 0; v < zoom; v++) { - unsigned char *px = px_row; - for (int u = 0; u < zoom; u++) { - *(px + 0) = (unsigned char)(rval >> 8); - *(px + 1) = (unsigned char)(gval >> 8); - *(px + 2) = (unsigned char)(bval >> 8); - px += 3; - } - px_row += p_stride; - } - if (hbd) { - int dc = ((y16 - y_row16) & 1) | (1 - img->x_chroma_shift); - y16++; - cb16 += dc; - cr16 += dc; - } else { - int dc = ((y - y_row) & 1) | (1 - img->x_chroma_shift); - y++; - cb += dc; - cr += dc; - } - p += zoom * 3; - } - int dc = -((j & 1) | (1 - img->y_chroma_shift)); - if (hbd) { - y_row16 += y_stride; - cb_row16 += dc & cb_stride; - cr_row16 += dc & cr_stride; - } else { - y_row += y_stride; - cb_row += dc & cb_stride; - cr_row += dc & cr_stride; - } - p_row += zoom * p_stride; - } -} - -void AnalyzerPanel::computeBitsPerPixel() { - Accounting *acct; - double bpp_total; - int totals_q3[MAX_SYMBOL_TYPES] = { 0 }; - int sym_count[MAX_SYMBOL_TYPES] = { 0 }; - decoder.getAccountingStruct(&acct); - for (int j = 0; j < decoder.getHeight(); j++) { - for (int i = 0; i < decoder.getWidth(); i++) { - bpp_q3[j * decoder.getWidth() + i] = 0.0; - } - } - bpp_total = 0; - for (int i = 0; i < acct->syms.num_syms; i++) { - AccountingSymbol *s; - s = &acct->syms.syms[i]; - totals_q3[s->id] += s->bits; - sym_count[s->id] += s->samples; - } - printf("=== Frame: %-3i ===\n", decoder.frame - 1); - for (int i = 0; i < acct->syms.dictionary.num_strs; i++) { - if (totals_q3[i]) { - printf("%30s = %10.3f (%f bit/symbol)\n", acct->syms.dictionary.strs[i], - (float)totals_q3[i] / 8, (float)totals_q3[i] / 8 / sym_count[i]); - } - } - printf("\n"); -} - -void AnalyzerPanel::togglePadding() { - decoder.togglePadding(); - updateDisplaySize(); -} - -bool AnalyzerPanel::nextFrame() { - if (decoder.step()) { - refresh(); - return true; - } - return false; -} - -void AnalyzerPanel::refresh() { - if (bit_accounting) { - computeBitsPerPixel(); - } - render(); -} - -int AnalyzerPanel::getDisplayWidth() const { return zoom * decoder.getWidth(); } - -int AnalyzerPanel::getDisplayHeight() const { - return zoom * decoder.getHeight(); -} - -bool AnalyzerPanel::updateDisplaySize() { - unsigned char *p = (unsigned char *)malloc( - sizeof(*p) * 3 * getDisplayWidth() * getDisplayHeight()); - if (p == NULL) { - return false; - } - free(pixels); - pixels = p; - SetSize(getDisplayWidth(), getDisplayHeight()); - return true; -} - -bool AnalyzerPanel::open(const wxString &path) { - if (!decoder.open(path)) { - return false; - } - if (!setZoom(MIN_ZOOM)) { - return false; - } - if (bit_accounting) { - bpp_q3 = (double *)malloc(sizeof(*bpp_q3) * decoder.getWidth() * - decoder.getHeight()); - if (bpp_q3 == NULL) { - fprintf(stderr, "Could not allocate memory for bit accounting\n"); - close(); - return false; - } - } - if (!nextFrame()) { - close(); - return false; - } - SetFocus(); - return true; -} - -void AnalyzerPanel::close() { - decoder.close(); - free(pixels); - pixels = NULL; - free(bpp_q3); - bpp_q3 = NULL; -} - -int AnalyzerPanel::getZoom() const { return zoom; } - -bool AnalyzerPanel::setZoom(int z) { - if (z <= MAX_ZOOM && z >= MIN_ZOOM && zoom != z) { - int old_zoom = zoom; - zoom = z; - if (!updateDisplaySize()) { - zoom = old_zoom; - return false; - } - return true; - } - return false; -} - -void AnalyzerPanel::onPaint(wxPaintEvent &) { - wxBitmap bmp(wxImage(getDisplayWidth(), getDisplayHeight(), pixels, true)); - wxBufferedPaintDC dc(this, bmp); -} - -class AnalyzerFrame : public wxFrame { - DECLARE_EVENT_TABLE() - - private: - AnalyzerPanel *panel; - const bool bit_accounting; - - wxMenu *fileMenu; - wxMenu *viewMenu; - wxMenu *playbackMenu; - - public: - AnalyzerFrame(const bool bit_accounting); // NOLINT - - void onOpen(wxCommandEvent &event); // NOLINT - void onClose(wxCommandEvent &event); // NOLINT - void onQuit(wxCommandEvent &event); // NOLINT - - void onTogglePadding(wxCommandEvent &event); // NOLINT - void onZoomIn(wxCommandEvent &event); // NOLINT - void onZoomOut(wxCommandEvent &event); // NOLINT - void onActualSize(wxCommandEvent &event); // NOLINT - - void onToggleViewMenuCheckBox(wxCommandEvent &event); // NOLINT - void onResetAndToggleViewMenuCheckBox(wxCommandEvent &event); // NOLINT - - void onNextFrame(wxCommandEvent &event); // NOLINT - void onGotoFrame(wxCommandEvent &event); // NOLINT - void onRestart(wxCommandEvent &event); // NOLINT - - void onAbout(wxCommandEvent &event); // NOLINT - - bool open(const wxString &path); - bool setZoom(int zoom); - void updateViewMenu(); -}; - -enum { - wxID_NEXT_FRAME = 6000, - wxID_SHOW_Y, - wxID_SHOW_U, - wxID_SHOW_V, - wxID_GOTO_FRAME, - wxID_RESTART, - wxID_ACTUAL_SIZE, - wxID_PADDING -}; - -BEGIN_EVENT_TABLE(AnalyzerFrame, wxFrame) -EVT_MENU(wxID_OPEN, AnalyzerFrame::onOpen) -EVT_MENU(wxID_CLOSE, AnalyzerFrame::onClose) -EVT_MENU(wxID_EXIT, AnalyzerFrame::onQuit) -EVT_MENU(wxID_PADDING, AnalyzerFrame::onTogglePadding) -EVT_MENU(wxID_ZOOM_IN, AnalyzerFrame::onZoomIn) -EVT_MENU(wxID_ZOOM_OUT, AnalyzerFrame::onZoomOut) -EVT_MENU(wxID_ACTUAL_SIZE, AnalyzerFrame::onActualSize) -EVT_MENU(wxID_SHOW_Y, AnalyzerFrame::onResetAndToggleViewMenuCheckBox) -EVT_MENU(wxID_SHOW_U, AnalyzerFrame::onResetAndToggleViewMenuCheckBox) -EVT_MENU(wxID_SHOW_V, AnalyzerFrame::onResetAndToggleViewMenuCheckBox) -EVT_MENU(wxID_NEXT_FRAME, AnalyzerFrame::onNextFrame) -EVT_MENU(wxID_GOTO_FRAME, AnalyzerFrame::onGotoFrame) -EVT_MENU(wxID_RESTART, AnalyzerFrame::onRestart) -EVT_MENU(wxID_ABOUT, AnalyzerFrame::onAbout) -END_EVENT_TABLE() - -AnalyzerFrame::AnalyzerFrame(const bool bit_accounting) - : wxFrame(NULL, wxID_ANY, _("AV1 Stream Analyzer"), wxDefaultPosition, - wxDefaultSize, wxDEFAULT_FRAME_STYLE), - panel(NULL), bit_accounting(bit_accounting) { - wxMenuBar *mb = new wxMenuBar(); - - fileMenu = new wxMenu(); - fileMenu->Append(wxID_OPEN, _("&Open...\tCtrl-O"), _("Open daala file")); - fileMenu->Append(wxID_CLOSE, _("&Close\tCtrl-W"), _("Close daala file")); - fileMenu->Enable(wxID_CLOSE, false); - fileMenu->Append(wxID_EXIT, _("E&xit\tCtrl-Q"), _("Quit this program")); - mb->Append(fileMenu, _("&File")); - - wxAcceleratorEntry entries[2]; - entries[0].Set(wxACCEL_CTRL, (int)'=', wxID_ZOOM_IN); - entries[1].Set(wxACCEL_CTRL | wxACCEL_SHIFT, (int)'-', wxID_ZOOM_OUT); - wxAcceleratorTable accel(2, entries); - this->SetAcceleratorTable(accel); - - viewMenu = new wxMenu(); - +viewMenu->Append(wxID_PADDING, _("Toggle padding\tCtrl-p"), - _("Show padding")); - viewMenu->Append(wxID_ZOOM_IN, _("Zoom-In\tCtrl-+"), _("Double image size")); - viewMenu->Append(wxID_ZOOM_OUT, _("Zoom-Out\tCtrl--"), _("Half image size")); - viewMenu->Append(wxID_ACTUAL_SIZE, _("Actual size\tCtrl-0"), - _("Actual size of the frame")); - viewMenu->AppendSeparator(); - viewMenu->AppendCheckItem(wxID_SHOW_Y, _("&Y plane\tCtrl-Y"), - _("Show Y plane")); - viewMenu->AppendCheckItem(wxID_SHOW_U, _("&U plane\tCtrl-U"), - _("Show U plane")); - viewMenu->AppendCheckItem(wxID_SHOW_V, _("&V plane\tCtrl-V"), - _("Show V plane")); - mb->Append(viewMenu, _("&View")); - - playbackMenu = new wxMenu(); - playbackMenu->Append(wxID_NEXT_FRAME, _("Next frame\tCtrl-."), - _("Go to next frame")); - /*playbackMenu->Append(wxID_RESTART, _("&Restart\tCtrl-R"), - _("Set video to frame 0")); - playbackMenu->Append(wxID_GOTO_FRAME, _("Jump to Frame\tCtrl-J"), - _("Go to frame number"));*/ - mb->Append(playbackMenu, _("&Playback")); - - wxMenu *helpMenu = new wxMenu(); - helpMenu->Append(wxID_ABOUT, _("&About...\tF1"), _("Show about dialog")); - mb->Append(helpMenu, _("&Help")); - - SetMenuBar(mb); - - CreateStatusBar(1); -} - -void AnalyzerFrame::onOpen(wxCommandEvent &WXUNUSED(event)) { - wxFileDialog openFileDialog(this, _("Open file"), wxEmptyString, - wxEmptyString, _("AV1 files (*.ivf)|*.ivf"), - wxFD_OPEN | wxFD_FILE_MUST_EXIST); - if (openFileDialog.ShowModal() != wxID_CANCEL) { - open(openFileDialog.GetPath()); - } -} - -void AnalyzerFrame::onClose(wxCommandEvent &WXUNUSED(event)) {} - -void AnalyzerFrame::onQuit(wxCommandEvent &WXUNUSED(event)) { Close(true); } - -void AnalyzerFrame::onTogglePadding(wxCommandEvent &WXUNUSED(event)) { - panel->togglePadding(); - SetClientSize(panel->GetSize()); - panel->render(); - panel->Refresh(); -} - -void AnalyzerFrame::onZoomIn(wxCommandEvent &WXUNUSED(event)) { - setZoom(panel->getZoom() + 1); -} - -void AnalyzerFrame::onZoomOut(wxCommandEvent &WXUNUSED(event)) { - setZoom(panel->getZoom() - 1); -} - -void AnalyzerFrame::onActualSize(wxCommandEvent &WXUNUSED(event)) { - setZoom(MIN_ZOOM); -} - -void AnalyzerFrame::onToggleViewMenuCheckBox(wxCommandEvent &event) { // NOLINT - GetMenuBar()->Check(event.GetId(), event.IsChecked()); - updateViewMenu(); -} - -void AnalyzerFrame::onResetAndToggleViewMenuCheckBox( - wxCommandEvent &event) { // NOLINT - int id = event.GetId(); - if (id != wxID_SHOW_Y && id != wxID_SHOW_U && id != wxID_SHOW_V) { - GetMenuBar()->Check(wxID_SHOW_Y, true); - GetMenuBar()->Check(wxID_SHOW_U, true); - GetMenuBar()->Check(wxID_SHOW_V, true); - } - onToggleViewMenuCheckBox(event); -} - -void AnalyzerFrame::onNextFrame(wxCommandEvent &WXUNUSED(event)) { - panel->nextFrame(); - panel->Refresh(false); -} - -void AnalyzerFrame::onGotoFrame(wxCommandEvent &WXUNUSED(event)) {} - -void AnalyzerFrame::onRestart(wxCommandEvent &WXUNUSED(event)) {} - -void AnalyzerFrame::onAbout(wxCommandEvent &WXUNUSED(event)) { - wxAboutDialogInfo info; - info.SetName(_("AV1 Bitstream Analyzer")); - info.SetVersion(_("0.1-beta")); - info.SetDescription( - _("This program implements a bitstream analyzer for AV1")); - info.SetCopyright( - wxT("(C) 2017 Alliance for Open Media <negge@mozilla.com>")); - wxAboutBox(info); -} - -bool AnalyzerFrame::open(const wxString &path) { - panel = new AnalyzerPanel(this, path, bit_accounting); - if (panel->open(path)) { - SetClientSize(panel->GetSize()); - return true; - } else { - delete panel; - return false; - } -} - -bool AnalyzerFrame::setZoom(int zoom) { - if (panel->setZoom(zoom)) { - GetMenuBar()->Enable(wxID_ACTUAL_SIZE, zoom != MIN_ZOOM); - GetMenuBar()->Enable(wxID_ZOOM_IN, zoom != MAX_ZOOM); - GetMenuBar()->Enable(wxID_ZOOM_OUT, zoom != MIN_ZOOM); - SetClientSize(panel->GetSize()); - panel->render(); - panel->Refresh(); - return true; - } - return false; -} - -void AnalyzerFrame::updateViewMenu() { - panel->setShowPlane(GetMenuBar()->IsChecked(wxID_SHOW_Y), OD_LUMA_MASK); - panel->setShowPlane(GetMenuBar()->IsChecked(wxID_SHOW_U), OD_CB_MASK); - panel->setShowPlane(GetMenuBar()->IsChecked(wxID_SHOW_V), OD_CR_MASK); - SetClientSize(panel->GetSize()); - panel->render(); - panel->Refresh(false); -} - -class Analyzer : public wxApp { - private: - AnalyzerFrame *frame; - - public: - void OnInitCmdLine(wxCmdLineParser &parser); // NOLINT - bool OnCmdLineParsed(wxCmdLineParser &parser); // NOLINT -}; - -static const wxCmdLineEntryDesc CMD_LINE_DESC[] = { - { wxCMD_LINE_SWITCH, _("h"), _("help"), _("Display this help and exit."), - wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, - { wxCMD_LINE_SWITCH, _("a"), _("bit-accounting"), _("Enable bit accounting"), - wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL }, - { wxCMD_LINE_PARAM, NULL, NULL, _("input.ivf"), wxCMD_LINE_VAL_STRING, - wxCMD_LINE_PARAM_OPTIONAL }, - { wxCMD_LINE_NONE } -}; - -void Analyzer::OnInitCmdLine(wxCmdLineParser &parser) { // NOLINT - parser.SetDesc(CMD_LINE_DESC); - parser.SetSwitchChars(_("-")); -} - -bool Analyzer::OnCmdLineParsed(wxCmdLineParser &parser) { // NOLINT - bool bit_accounting = parser.Found(_("a")); - if (bit_accounting && !CONFIG_ACCOUNTING) { - fprintf(stderr, - "Bit accounting support not found. " - "Recompile with:\n./cmake -DCONFIG_ACCOUNTING=1\n"); - return false; - } - frame = new AnalyzerFrame(parser.Found(_("a"))); - frame->Show(); - if (parser.GetParamCount() > 0) { - return frame->open(parser.GetParam(0)); - } - return true; -} - -void usage_exit(void) { - fprintf(stderr, "uhh\n"); - exit(EXIT_FAILURE); -} - -IMPLEMENT_APP(Analyzer) diff --git a/third_party/aom/examples/aom_cx_set_ref.c b/third_party/aom/examples/aom_cx_set_ref.c deleted file mode 100644 index 8e3d216fe..000000000 --- a/third_party/aom/examples/aom_cx_set_ref.c +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// AV1 Set Reference Frame -// ============================ -// -// This is an example demonstrating how to overwrite the AV1 encoder's -// internal reference frame. In the sample we set the last frame to the -// current frame. This technique could be used to bounce between two cameras. -// -// The decoder would also have to set the reference frame to the same value -// on the same frame, or the video will become corrupt. The 'test_decode' -// variable is set to 1 in this example that tests if the encoder and decoder -// results are matching. -// -// Usage -// ----- -// This example encodes a raw video. And the last argument passed in specifies -// the frame number to update the reference frame on. For example, run -// examples/aom_cx_set_ref av1 352 288 in.yuv out.ivf 4 30 -// The parameter is parsed as follows: -// -// -// Extra Variables -// --------------- -// This example maintains the frame number passed on the command line -// in the `update_frame_num` variable. -// -// -// Configuration -// ------------- -// -// The reference frame is updated on the frame specified on the command -// line. -// -// Observing The Effects -// --------------------- -// The encoder and decoder results should be matching when the same reference -// frame setting operation is done in both encoder and decoder. Otherwise, -// the encoder/decoder mismatch would be seen. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_decoder.h" -#include "aom/aom_encoder.h" -#include "aom/aomcx.h" -#include "aom_scale/yv12config.h" -#include "common/tools_common.h" -#include "common/video_writer.h" -#include "examples/encoder_util.h" - -static const char *exec_name; - -void usage_exit() { - fprintf(stderr, - "Usage: %s <codec> <width> <height> <infile> <outfile> " - "<frame> <limit(optional)>\n", - exec_name); - exit(EXIT_FAILURE); -} - -static void testing_decode(aom_codec_ctx_t *encoder, aom_codec_ctx_t *decoder, - unsigned int frame_out, int *mismatch_seen) { - aom_image_t enc_img, dec_img; - - if (*mismatch_seen) return; - - /* Get the internal reference frame */ - if (aom_codec_control(encoder, AV1_GET_NEW_FRAME_IMAGE, &enc_img)) - die_codec(encoder, "Failed to get encoder reference frame"); - if (aom_codec_control(decoder, AV1_GET_NEW_FRAME_IMAGE, &dec_img)) - die_codec(decoder, "Failed to get decoder reference frame"); - - if ((enc_img.fmt & AOM_IMG_FMT_HIGHBITDEPTH) != - (dec_img.fmt & AOM_IMG_FMT_HIGHBITDEPTH)) { - if (enc_img.fmt & AOM_IMG_FMT_HIGHBITDEPTH) { - aom_image_t enc_hbd_img; - aom_img_alloc(&enc_hbd_img, enc_img.fmt - AOM_IMG_FMT_HIGHBITDEPTH, - enc_img.d_w, enc_img.d_h, 16); - aom_img_truncate_16_to_8(&enc_hbd_img, &enc_img); - enc_img = enc_hbd_img; - } - if (dec_img.fmt & AOM_IMG_FMT_HIGHBITDEPTH) { - aom_image_t dec_hbd_img; - aom_img_alloc(&dec_hbd_img, dec_img.fmt - AOM_IMG_FMT_HIGHBITDEPTH, - dec_img.d_w, dec_img.d_h, 16); - aom_img_truncate_16_to_8(&dec_hbd_img, &dec_img); - dec_img = dec_hbd_img; - } - } - - if (!aom_compare_img(&enc_img, &dec_img)) { - int y[4], u[4], v[4]; - if (enc_img.fmt & AOM_IMG_FMT_HIGHBITDEPTH) { - aom_find_mismatch_high(&enc_img, &dec_img, y, u, v); - } else { - aom_find_mismatch(&enc_img, &dec_img, y, u, v); - } - - printf( - "Encode/decode mismatch on frame %d at" - " Y[%d, %d] {%d/%d}," - " U[%d, %d] {%d/%d}," - " V[%d, %d] {%d/%d}", - frame_out, y[0], y[1], y[2], y[3], u[0], u[1], u[2], u[3], v[0], v[1], - v[2], v[3]); - *mismatch_seen = 1; - } - - aom_img_free(&enc_img); - aom_img_free(&dec_img); -} - -static int encode_frame(aom_codec_ctx_t *ecodec, aom_image_t *img, - unsigned int frame_in, AvxVideoWriter *writer, - int test_decode, aom_codec_ctx_t *dcodec, - unsigned int *frame_out, int *mismatch_seen, - aom_image_t *ext_ref) { - int got_pkts = 0; - aom_codec_iter_t iter = NULL; - const aom_codec_cx_pkt_t *pkt = NULL; - int got_data; - const aom_codec_err_t res = aom_codec_encode(ecodec, img, frame_in, 1, 0); - if (res != AOM_CODEC_OK) die_codec(ecodec, "Failed to encode frame"); - - got_data = 0; - - while ((pkt = aom_codec_get_cx_data(ecodec, &iter)) != NULL) { - got_pkts = 1; - - if (pkt->kind == AOM_CODEC_CX_FRAME_PKT) { - const int keyframe = (pkt->data.frame.flags & AOM_FRAME_IS_KEY) != 0; - - if (!(pkt->data.frame.flags & AOM_FRAME_IS_FRAGMENT)) { - *frame_out += 1; - } - - if (!aom_video_writer_write_frame(writer, pkt->data.frame.buf, - pkt->data.frame.sz, - pkt->data.frame.pts)) { - die_codec(ecodec, "Failed to write compressed frame"); - } - printf(keyframe ? "K" : "."); - fflush(stdout); - got_data = 1; - - // Decode 1 frame. - if (test_decode) { - if (aom_codec_decode(dcodec, pkt->data.frame.buf, - (unsigned int)pkt->data.frame.sz, NULL)) - die_codec(dcodec, "Failed to decode frame."); - - // Copy out first decoded frame, and use it as reference later. - if (*frame_out == 1 && ext_ref != NULL) - if (aom_codec_control(dcodec, AV1_COPY_NEW_FRAME_IMAGE, ext_ref)) - die_codec(dcodec, "Failed to get decoder new frame"); - } - } - } - - // Mismatch checking - if (got_data && test_decode) { - testing_decode(ecodec, dcodec, *frame_out, mismatch_seen); - } - - return got_pkts; -} - -int main(int argc, char **argv) { - FILE *infile = NULL; - // Encoder - aom_codec_ctx_t ecodec; - aom_codec_enc_cfg_t cfg; - unsigned int frame_in = 0; - aom_image_t raw; - aom_image_t raw_shift; - aom_image_t ext_ref; - aom_codec_err_t res; - AvxVideoInfo info; - AvxVideoWriter *writer = NULL; - const AvxInterface *encoder = NULL; - int flags = 0; - int allocated_raw_shift = 0; - aom_img_fmt_t raw_fmt = AOM_IMG_FMT_I420; - aom_img_fmt_t ref_fmt = AOM_IMG_FMT_I420; - - // Test encoder/decoder mismatch. - int test_decode = 1; - // Decoder - aom_codec_ctx_t dcodec; - unsigned int frame_out = 0; - - // The frame number to set reference frame on - unsigned int update_frame_num = 0; - int mismatch_seen = 0; - - const int fps = 30; - const int bitrate = 500; - - const char *codec_arg = NULL; - const char *width_arg = NULL; - const char *height_arg = NULL; - const char *infile_arg = NULL; - const char *outfile_arg = NULL; - const char *update_frame_num_arg = NULL; - unsigned int limit = 0; - exec_name = argv[0]; - - // Clear explicitly, as simply assigning "{ 0 }" generates - // "missing-field-initializers" warning in some compilers. - memset(&ecodec, 0, sizeof(ecodec)); - memset(&cfg, 0, sizeof(cfg)); - memset(&info, 0, sizeof(info)); - - if (argc < 7) die("Invalid number of arguments"); - - codec_arg = argv[1]; - width_arg = argv[2]; - height_arg = argv[3]; - infile_arg = argv[4]; - outfile_arg = argv[5]; - update_frame_num_arg = argv[6]; - - encoder = get_aom_encoder_by_name(codec_arg); - if (!encoder) die("Unsupported codec."); - - update_frame_num = (unsigned int)strtoul(update_frame_num_arg, NULL, 0); - // In AV1, the reference buffers (cm->buffer_pool->frame_bufs[i].buf) are - // allocated while calling aom_codec_encode(), thus, setting reference for - // 1st frame isn't supported. - if (update_frame_num <= 1) { - die("Couldn't parse frame number '%s'\n", update_frame_num_arg); - } - - if (argc > 7) { - limit = (unsigned int)strtoul(argv[7], NULL, 0); - if (update_frame_num > limit) - die("Update frame number couldn't larger than limit\n"); - } - - info.codec_fourcc = encoder->fourcc; - info.frame_width = (int)strtol(width_arg, NULL, 0); - info.frame_height = (int)strtol(height_arg, NULL, 0); - info.time_base.numerator = 1; - info.time_base.denominator = fps; - - if (info.frame_width <= 0 || info.frame_height <= 0) { - die("Invalid frame size: %dx%d", info.frame_width, info.frame_height); - } - - // In this test, the bit depth of input video is 8-bit, and the input format - // is AOM_IMG_FMT_I420. - if (!aom_img_alloc(&raw, raw_fmt, info.frame_width, info.frame_height, 32)) { - die("Failed to allocate image."); - } - - if (!CONFIG_LOWBITDEPTH) ref_fmt |= AOM_IMG_FMT_HIGHBITDEPTH; - // Allocate memory with the border so that it can be used as a reference. - if (!aom_img_alloc_with_border(&ext_ref, ref_fmt, info.frame_width, - info.frame_height, 32, 8, - AOM_BORDER_IN_PIXELS)) { - die("Failed to allocate image."); - } - - printf("Using %s\n", aom_codec_iface_name(encoder->codec_interface())); - - res = aom_codec_enc_config_default(encoder->codec_interface(), &cfg, 0); - if (res) die_codec(&ecodec, "Failed to get default codec config."); - - cfg.g_w = info.frame_width; - cfg.g_h = info.frame_height; - cfg.g_timebase.num = info.time_base.numerator; - cfg.g_timebase.den = info.time_base.denominator; - cfg.rc_target_bitrate = bitrate; - cfg.g_lag_in_frames = 3; - cfg.g_bit_depth = AOM_BITS_8; - - flags |= (cfg.g_bit_depth > AOM_BITS_8 || !CONFIG_LOWBITDEPTH) - ? AOM_CODEC_USE_HIGHBITDEPTH - : 0; - - writer = aom_video_writer_open(outfile_arg, kContainerIVF, &info); - if (!writer) die("Failed to open %s for writing.", outfile_arg); - - if (!(infile = fopen(infile_arg, "rb"))) - die("Failed to open %s for reading.", infile_arg); - - if (aom_codec_enc_init(&ecodec, encoder->codec_interface(), &cfg, flags)) - die_codec(&ecodec, "Failed to initialize encoder"); - - // Disable alt_ref. - if (aom_codec_control(&ecodec, AOME_SET_ENABLEAUTOALTREF, 0)) - die_codec(&ecodec, "Failed to set enable auto alt ref"); - - if (test_decode) { - const AvxInterface *decoder = get_aom_decoder_by_name(codec_arg); - if (aom_codec_dec_init(&dcodec, decoder->codec_interface(), NULL, 0)) - die_codec(&dcodec, "Failed to initialize decoder."); - } - - // Encode frames. - while (aom_img_read(&raw, infile)) { - if (limit && frame_in >= limit) break; - aom_image_t *frame_to_encode; - - if (!CONFIG_LOWBITDEPTH) { - // Need to allocate larger buffer to use hbd internal. - int input_shift = 0; - if (!allocated_raw_shift) { - aom_img_alloc(&raw_shift, raw_fmt | AOM_IMG_FMT_HIGHBITDEPTH, - info.frame_width, info.frame_height, 32); - allocated_raw_shift = 1; - } - aom_img_upshift(&raw_shift, &raw, input_shift); - frame_to_encode = &raw_shift; - } else { - frame_to_encode = &raw; - } - - if (update_frame_num > 1 && frame_out + 1 == update_frame_num) { - av1_ref_frame_t ref; - ref.idx = 0; - ref.use_external_ref = 0; - ref.img = ext_ref; - // Set reference frame in encoder. - if (aom_codec_control(&ecodec, AV1_SET_REFERENCE, &ref)) - die_codec(&ecodec, "Failed to set encoder reference frame"); - printf(" <SET_REF>"); - - // If set_reference in decoder is commented out, the enc/dec mismatch - // would be seen. - if (test_decode) { - ref.use_external_ref = 1; - if (aom_codec_control(&dcodec, AV1_SET_REFERENCE, &ref)) - die_codec(&dcodec, "Failed to set decoder reference frame"); - } - } - - encode_frame(&ecodec, frame_to_encode, frame_in, writer, test_decode, - &dcodec, &frame_out, &mismatch_seen, &ext_ref); - frame_in++; - if (mismatch_seen) break; - } - - // Flush encoder. - if (!mismatch_seen) - while (encode_frame(&ecodec, NULL, frame_in, writer, test_decode, &dcodec, - &frame_out, &mismatch_seen, NULL)) { - } - - printf("\n"); - fclose(infile); - printf("Processed %d frames.\n", frame_out); - - if (test_decode) { - if (!mismatch_seen) - printf("Encoder/decoder results are matching.\n"); - else - printf("Encoder/decoder results are NOT matching.\n"); - } - - if (test_decode) - if (aom_codec_destroy(&dcodec)) - die_codec(&dcodec, "Failed to destroy decoder"); - - if (allocated_raw_shift) aom_img_free(&raw_shift); - aom_img_free(&ext_ref); - aom_img_free(&raw); - if (aom_codec_destroy(&ecodec)) - die_codec(&ecodec, "Failed to destroy encoder."); - - aom_video_writer_close(writer); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/decode_to_md5.c b/third_party/aom/examples/decode_to_md5.c deleted file mode 100644 index bc127b78d..000000000 --- a/third_party/aom/examples/decode_to_md5.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Frame-by-frame MD5 Checksum -// =========================== -// -// This example builds upon the simple decoder loop to show how checksums -// of the decoded output can be generated. These are used for validating -// decoder implementations against the reference implementation, for example. -// -// MD5 algorithm -// ------------- -// The Message-Digest 5 (MD5) is a well known hash function. We have provided -// an implementation derived from the RSA Data Security, Inc. MD5 Message-Digest -// Algorithm for your use. Our implmentation only changes the interface of this -// reference code. You must include the `md5_utils.h` header for access to these -// functions. -// -// Processing The Decoded Data -// --------------------------- -// Each row of the image is passed to the MD5 accumulator. First the Y plane -// is processed, then U, then V. It is important to honor the image's `stride` -// values. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_decoder.h" -#include "aom/aomdx.h" -#include "common/md5_utils.h" -#include "common/tools_common.h" -#include "common/video_reader.h" - -static void get_image_md5(const aom_image_t *img, unsigned char digest[16]) { - int plane, y; - MD5Context md5; - - MD5Init(&md5); - - for (plane = 0; plane < 3; ++plane) { - const unsigned char *buf = img->planes[plane]; - const int stride = img->stride[plane]; - const int w = plane ? (img->d_w + 1) >> 1 : img->d_w; - const int h = plane ? (img->d_h + 1) >> 1 : img->d_h; - - for (y = 0; y < h; ++y) { - MD5Update(&md5, buf, w); - buf += stride; - } - } - - MD5Final(digest, &md5); -} - -static void print_md5(FILE *stream, unsigned char digest[16]) { - int i; - - for (i = 0; i < 16; ++i) fprintf(stream, "%02x", digest[i]); -} - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, "Usage: %s <infile> <outfile>\n", exec_name); - exit(EXIT_FAILURE); -} - -int main(int argc, char **argv) { - int frame_cnt = 0; - FILE *outfile = NULL; - aom_codec_ctx_t codec; - AvxVideoReader *reader = NULL; - const AvxVideoInfo *info = NULL; - const AvxInterface *decoder = NULL; - - exec_name = argv[0]; - - if (argc != 3) die("Invalid number of arguments."); - - reader = aom_video_reader_open(argv[1]); - if (!reader) die("Failed to open %s for reading.", argv[1]); - - if (!(outfile = fopen(argv[2], "wb"))) - die("Failed to open %s for writing.", argv[2]); - - info = aom_video_reader_get_info(reader); - - decoder = get_aom_decoder_by_fourcc(info->codec_fourcc); - if (!decoder) die("Unknown input codec."); - - printf("Using %s\n", aom_codec_iface_name(decoder->codec_interface())); - - if (aom_codec_dec_init(&codec, decoder->codec_interface(), NULL, 0)) - die_codec(&codec, "Failed to initialize decoder"); - - while (aom_video_reader_read_frame(reader)) { - aom_codec_iter_t iter = NULL; - aom_image_t *img = NULL; - size_t frame_size = 0; - const unsigned char *frame = - aom_video_reader_get_frame(reader, &frame_size); - if (aom_codec_decode(&codec, frame, frame_size, NULL)) - die_codec(&codec, "Failed to decode frame"); - - while ((img = aom_codec_get_frame(&codec, &iter)) != NULL) { - unsigned char digest[16]; - - get_image_md5(img, digest); - print_md5(outfile, digest); - fprintf(outfile, " img-%dx%d-%04d.i420\n", img->d_w, img->d_h, - ++frame_cnt); - } - } - - printf("Processed %d frames.\n", frame_cnt); - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec."); - - aom_video_reader_close(reader); - - fclose(outfile); - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/decode_with_drops.c b/third_party/aom/examples/decode_with_drops.c deleted file mode 100644 index 214401958..000000000 --- a/third_party/aom/examples/decode_with_drops.c +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Decode With Drops Example -// ========================= -// -// This is an example utility which drops a series of frames, as specified -// on the command line. This is useful for observing the error recovery -// features of the codec. -// -// Usage -// ----- -// This example adds a single argument to the `simple_decoder` example, -// which specifies the range or pattern of frames to drop. The parameter is -// parsed as follows: -// -// Dropping A Range Of Frames -// -------------------------- -// To drop a range of frames, specify the starting frame and the ending -// frame to drop, separated by a dash. The following command will drop -// frames 5 through 10 (base 1). -// -// $ ./decode_with_drops in.ivf out.i420 5-10 -// -// -// Dropping A Pattern Of Frames -// ---------------------------- -// To drop a pattern of frames, specify the number of frames to drop and -// the number of frames after which to repeat the pattern, separated by -// a forward-slash. The following command will drop 3 of 7 frames. -// Specifically, it will decode 4 frames, then drop 3 frames, and then -// repeat. -// -// $ ./decode_with_drops in.ivf out.i420 3/7 -// -// -// Extra Variables -// --------------- -// This example maintains the pattern passed on the command line in the -// `n`, `m`, and `is_range` variables: -// -// -// Making The Drop Decision -// ------------------------ -// The example decides whether to drop the frame based on the current -// frame number, immediately before decoding the frame. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_decoder.h" -#include "aom/aomdx.h" -#include "common/tools_common.h" -#include "common/video_reader.h" - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, "Usage: %s <infile> <outfile> <N-M|N/M>\n", exec_name); - exit(EXIT_FAILURE); -} - -int main(int argc, char **argv) { - int frame_cnt = 0; - FILE *outfile = NULL; - aom_codec_ctx_t codec; - const AvxInterface *decoder = NULL; - AvxVideoReader *reader = NULL; - const AvxVideoInfo *info = NULL; - int n = 0; - int m = 0; - int is_range = 0; - char *nptr = NULL; - - exec_name = argv[0]; - - if (argc != 4) die("Invalid number of arguments."); - - reader = aom_video_reader_open(argv[1]); - if (!reader) die("Failed to open %s for reading.", argv[1]); - - if (!(outfile = fopen(argv[2], "wb"))) - die("Failed to open %s for writing.", argv[2]); - - n = (int)strtol(argv[3], &nptr, 0); - m = (int)strtol(nptr + 1, NULL, 0); - is_range = (*nptr == '-'); - if (!n || !m || (*nptr != '-' && *nptr != '/')) - die("Couldn't parse pattern %s.\n", argv[3]); - - info = aom_video_reader_get_info(reader); - - decoder = get_aom_decoder_by_fourcc(info->codec_fourcc); - if (!decoder) die("Unknown input codec."); - - printf("Using %s\n", aom_codec_iface_name(decoder->codec_interface())); - - if (aom_codec_dec_init(&codec, decoder->codec_interface(), NULL, 0)) - die_codec(&codec, "Failed to initialize decoder."); - - while (aom_video_reader_read_frame(reader)) { - aom_codec_iter_t iter = NULL; - aom_image_t *img = NULL; - size_t frame_size = 0; - int skip; - const unsigned char *frame = - aom_video_reader_get_frame(reader, &frame_size); - ++frame_cnt; - - skip = (is_range && frame_cnt >= n && frame_cnt <= m) || - (!is_range && m - (frame_cnt - 1) % m <= n); - - if (!skip) { - putc('.', stdout); - if (aom_codec_decode(&codec, frame, frame_size, NULL)) - die_codec(&codec, "Failed to decode frame."); - - while ((img = aom_codec_get_frame(&codec, &iter)) != NULL) - aom_img_write(img, outfile); - } else { - putc('X', stdout); - } - - fflush(stdout); - } - - printf("Processed %d frames.\n", frame_cnt); - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec."); - - printf("Play: ffplay -f rawvideo -pix_fmt yuv420p -s %dx%d %s\n", - info->frame_width, info->frame_height, argv[2]); - - aom_video_reader_close(reader); - fclose(outfile); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/encoder_util.c b/third_party/aom/examples/encoder_util.c deleted file mode 100644 index e43b37250..000000000 --- a/third_party/aom/examples/encoder_util.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Utility functions used by encoder binaries. - -#include "examples/encoder_util.h" - -#include <assert.h> -#include <string.h> - -#include "aom/aom_integer.h" - -#define mmin(a, b) ((a) < (b) ? (a) : (b)) - -static void find_mismatch_plane(const aom_image_t *const img1, - const aom_image_t *const img2, int plane, - int use_highbitdepth, int loc[4]) { - const unsigned char *const p1 = img1->planes[plane]; - const int p1_stride = img1->stride[plane] >> use_highbitdepth; - const unsigned char *const p2 = img2->planes[plane]; - const int p2_stride = img2->stride[plane] >> use_highbitdepth; - const uint32_t bsize = 64; - const int is_y_plane = (plane == AOM_PLANE_Y); - const uint32_t bsizex = is_y_plane ? bsize : bsize >> img1->x_chroma_shift; - const uint32_t bsizey = is_y_plane ? bsize : bsize >> img1->y_chroma_shift; - const uint32_t c_w = - is_y_plane ? img1->d_w - : (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift; - const uint32_t c_h = - is_y_plane ? img1->d_h - : (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift; - assert(img1->d_w == img2->d_w && img1->d_h == img2->d_h); - assert(img1->x_chroma_shift == img2->x_chroma_shift && - img1->y_chroma_shift == img2->y_chroma_shift); - loc[0] = loc[1] = loc[2] = loc[3] = -1; - if (img1->monochrome && img2->monochrome && plane) return; - int match = 1; - uint32_t i, j; - for (i = 0; match && i < c_h; i += bsizey) { - for (j = 0; match && j < c_w; j += bsizex) { - const int si = - is_y_plane ? mmin(i + bsizey, c_h) - i : mmin(i + bsizey, c_h - i); - const int sj = - is_y_plane ? mmin(j + bsizex, c_w) - j : mmin(j + bsizex, c_w - j); - int k, l; - for (k = 0; match && k < si; ++k) { - for (l = 0; match && l < sj; ++l) { - const int row = i + k; - const int col = j + l; - const int offset1 = row * p1_stride + col; - const int offset2 = row * p2_stride + col; - const int val1 = use_highbitdepth - ? p1[2 * offset1] | (p1[2 * offset1 + 1] << 8) - : p1[offset1]; - const int val2 = use_highbitdepth - ? p2[2 * offset2] | (p2[2 * offset2 + 1] << 8) - : p2[offset2]; - if (val1 != val2) { - loc[0] = row; - loc[1] = col; - loc[2] = val1; - loc[3] = val2; - match = 0; - break; - } - } - } - } - } -} - -static void find_mismatch_helper(const aom_image_t *const img1, - const aom_image_t *const img2, - int use_highbitdepth, int yloc[4], int uloc[4], - int vloc[4]) { - find_mismatch_plane(img1, img2, AOM_PLANE_Y, use_highbitdepth, yloc); - find_mismatch_plane(img1, img2, AOM_PLANE_U, use_highbitdepth, uloc); - find_mismatch_plane(img1, img2, AOM_PLANE_V, use_highbitdepth, vloc); -} - -void aom_find_mismatch_high(const aom_image_t *const img1, - const aom_image_t *const img2, int yloc[4], - int uloc[4], int vloc[4]) { - find_mismatch_helper(img1, img2, 1, yloc, uloc, vloc); -} - -void aom_find_mismatch(const aom_image_t *const img1, - const aom_image_t *const img2, int yloc[4], int uloc[4], - int vloc[4]) { - find_mismatch_helper(img1, img2, 0, yloc, uloc, vloc); -} - -int aom_compare_img(const aom_image_t *const img1, - const aom_image_t *const img2) { - assert(img1->cp == img2->cp); - assert(img1->tc == img2->tc); - assert(img1->mc == img2->mc); - assert(img1->monochrome == img2->monochrome); - - int num_planes = img1->monochrome ? 1 : 3; - - uint32_t l_w = img1->d_w; - uint32_t c_w = (img1->d_w + img1->x_chroma_shift) >> img1->x_chroma_shift; - const uint32_t c_h = - (img1->d_h + img1->y_chroma_shift) >> img1->y_chroma_shift; - int match = 1; - - match &= (img1->fmt == img2->fmt); - match &= (img1->d_w == img2->d_w); - match &= (img1->d_h == img2->d_h); - if (img1->fmt & AOM_IMG_FMT_HIGHBITDEPTH) { - l_w *= 2; - c_w *= 2; - } - - for (int plane = 0; plane < num_planes; ++plane) { - uint32_t height = plane ? c_h : img1->d_h; - uint32_t width = plane ? c_w : l_w; - - for (uint32_t i = 0; i < height; ++i) { - match &= - (memcmp(img1->planes[plane] + i * img1->stride[plane], - img2->planes[plane] + i * img2->stride[plane], width) == 0); - } - } - - return match; -} diff --git a/third_party/aom/examples/encoder_util.h b/third_party/aom/examples/encoder_util.h deleted file mode 100644 index a6bb3fb48..000000000 --- a/third_party/aom/examples/encoder_util.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Utility functions used by encoder binaries. - -#ifndef AOM_EXAMPLES_ENCODER_UTIL_H_ -#define AOM_EXAMPLES_ENCODER_UTIL_H_ - -#include "aom/aom_image.h" - -// Returns mismatch location (?loc[0],?loc[1]) and the values at that location -// in img1 (?loc[2]) and img2 (?loc[3]). -void aom_find_mismatch_high(const aom_image_t *const img1, - const aom_image_t *const img2, int yloc[4], - int uloc[4], int vloc[4]); - -void aom_find_mismatch(const aom_image_t *const img1, - const aom_image_t *const img2, int yloc[4], int uloc[4], - int vloc[4]); - -// Returns 1 if the two images match. -int aom_compare_img(const aom_image_t *const img1, - const aom_image_t *const img2); - -#endif // AOM_EXAMPLES_ENCODER_UTIL_H_ diff --git a/third_party/aom/examples/inspect.c b/third_party/aom/examples/inspect.c deleted file mode 100644 index 9d5f0dcfc..000000000 --- a/third_party/aom/examples/inspect.c +++ /dev/null @@ -1,763 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Inspect Decoder -// ================ -// -// This is a simple decoder loop that writes JSON stats to stdout. This tool -// can also be compiled with Emscripten and used as a library. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#ifdef __EMSCRIPTEN__ -#include <emscripten.h> -#else -#define EMSCRIPTEN_KEEPALIVE -#endif - -#include "config/aom_config.h" - -#include "aom/aom_decoder.h" -#include "aom/aomdx.h" -#include "av1/common/onyxc_int.h" - -#if CONFIG_ACCOUNTING -#include "av1/decoder/accounting.h" -#endif - -#include "av1/decoder/inspection.h" -#include "common/args.h" -#include "common/tools_common.h" -#include "common/video_common.h" -#include "common/video_reader.h" - -// Max JSON buffer size. -const int MAX_BUFFER = 1024 * 1024 * 32; - -typedef enum { - ACCOUNTING_LAYER = 1, - BLOCK_SIZE_LAYER = 1 << 1, - TRANSFORM_SIZE_LAYER = 1 << 2, - TRANSFORM_TYPE_LAYER = 1 << 3, - MODE_LAYER = 1 << 4, - SKIP_LAYER = 1 << 5, - FILTER_LAYER = 1 << 6, - CDEF_LAYER = 1 << 7, - REFERENCE_FRAME_LAYER = 1 << 8, - MOTION_VECTORS_LAYER = 1 << 9, - UV_MODE_LAYER = 1 << 10, - CFL_LAYER = 1 << 11, - DUAL_FILTER_LAYER = 1 << 12, - Q_INDEX_LAYER = 1 << 13, - SEGMENT_ID_LAYER = 1 << 14, - ALL_LAYERS = (1 << 15) - 1 -} LayerType; - -static LayerType layers = 0; - -static int stop_after = 0; -static int compress = 0; - -static const arg_def_t limit_arg = - ARG_DEF(NULL, "limit", 1, "Stop decoding after n frames"); -static const arg_def_t dump_all_arg = ARG_DEF("A", "all", 0, "Dump All"); -static const arg_def_t compress_arg = - ARG_DEF("x", "compress", 0, "Compress JSON using RLE"); -static const arg_def_t dump_accounting_arg = - ARG_DEF("a", "accounting", 0, "Dump Accounting"); -static const arg_def_t dump_block_size_arg = - ARG_DEF("bs", "blockSize", 0, "Dump Block Size"); -static const arg_def_t dump_motion_vectors_arg = - ARG_DEF("mv", "motionVectors", 0, "Dump Motion Vectors"); -static const arg_def_t dump_transform_size_arg = - ARG_DEF("ts", "transformSize", 0, "Dump Transform Size"); -static const arg_def_t dump_transform_type_arg = - ARG_DEF("tt", "transformType", 0, "Dump Transform Type"); -static const arg_def_t dump_mode_arg = ARG_DEF("m", "mode", 0, "Dump Mode"); -static const arg_def_t dump_uv_mode_arg = - ARG_DEF("uvm", "uv_mode", 0, "Dump UV Intra Prediction Modes"); -static const arg_def_t dump_skip_arg = ARG_DEF("s", "skip", 0, "Dump Skip"); -static const arg_def_t dump_filter_arg = - ARG_DEF("f", "filter", 0, "Dump Filter"); -static const arg_def_t dump_cdef_arg = ARG_DEF("c", "cdef", 0, "Dump CDEF"); -static const arg_def_t dump_cfl_arg = - ARG_DEF("cfl", "chroma_from_luma", 0, "Dump Chroma from Luma Alphas"); -static const arg_def_t dump_dual_filter_type_arg = - ARG_DEF("df", "dualFilterType", 0, "Dump Dual Filter Type"); -static const arg_def_t dump_reference_frame_arg = - ARG_DEF("r", "referenceFrame", 0, "Dump Reference Frame"); -static const arg_def_t dump_delta_q_arg = - ARG_DEF("dq", "delta_q", 0, "Dump QIndex"); -static const arg_def_t dump_seg_id_arg = - ARG_DEF("si", "seg_id", 0, "Dump Segment ID"); -static const arg_def_t usage_arg = ARG_DEF("h", "help", 0, "Help"); - -static const arg_def_t *main_args[] = { &limit_arg, - &dump_all_arg, - &compress_arg, -#if CONFIG_ACCOUNTING - &dump_accounting_arg, -#endif - &dump_block_size_arg, - &dump_transform_size_arg, - &dump_transform_type_arg, - &dump_mode_arg, - &dump_uv_mode_arg, - &dump_skip_arg, - &dump_filter_arg, - &dump_cdef_arg, - &dump_dual_filter_type_arg, - &dump_cfl_arg, - &dump_reference_frame_arg, - &dump_motion_vectors_arg, - &dump_delta_q_arg, - &dump_seg_id_arg, - &usage_arg, - NULL }; -#define ENUM(name) \ - { #name, name } -#define LAST_ENUM \ - { NULL, 0 } -typedef struct map_entry { - const char *name; - int value; -} map_entry; - -const map_entry refs_map[] = { - ENUM(INTRA_FRAME), ENUM(LAST_FRAME), ENUM(LAST2_FRAME), - ENUM(LAST3_FRAME), ENUM(GOLDEN_FRAME), ENUM(BWDREF_FRAME), - ENUM(ALTREF2_FRAME), ENUM(ALTREF_FRAME), LAST_ENUM -}; - -const map_entry block_size_map[] = { - ENUM(BLOCK_4X4), ENUM(BLOCK_4X8), ENUM(BLOCK_8X4), - ENUM(BLOCK_8X8), ENUM(BLOCK_8X16), ENUM(BLOCK_16X8), - ENUM(BLOCK_16X16), ENUM(BLOCK_16X32), ENUM(BLOCK_32X16), - ENUM(BLOCK_32X32), ENUM(BLOCK_32X64), ENUM(BLOCK_64X32), - ENUM(BLOCK_64X64), ENUM(BLOCK_64X128), ENUM(BLOCK_128X64), - ENUM(BLOCK_128X128), ENUM(BLOCK_4X16), ENUM(BLOCK_16X4), - ENUM(BLOCK_8X32), ENUM(BLOCK_32X8), ENUM(BLOCK_16X64), - ENUM(BLOCK_64X16), LAST_ENUM -}; - -const map_entry tx_size_map[] = { - ENUM(TX_4X4), ENUM(TX_8X8), ENUM(TX_16X16), ENUM(TX_32X32), - ENUM(TX_64X64), ENUM(TX_4X8), ENUM(TX_8X4), ENUM(TX_8X16), - ENUM(TX_16X8), ENUM(TX_16X32), ENUM(TX_32X16), ENUM(TX_32X64), - ENUM(TX_64X32), ENUM(TX_4X16), ENUM(TX_16X4), ENUM(TX_8X32), - ENUM(TX_32X8), LAST_ENUM -}; - -const map_entry tx_type_map[] = { ENUM(DCT_DCT), - ENUM(ADST_DCT), - ENUM(DCT_ADST), - ENUM(ADST_ADST), - ENUM(FLIPADST_DCT), - ENUM(DCT_FLIPADST), - ENUM(FLIPADST_FLIPADST), - ENUM(ADST_FLIPADST), - ENUM(FLIPADST_ADST), - ENUM(IDTX), - ENUM(V_DCT), - ENUM(H_DCT), - ENUM(V_ADST), - ENUM(H_ADST), - ENUM(V_FLIPADST), - ENUM(H_FLIPADST), - LAST_ENUM }; -const map_entry dual_filter_map[] = { ENUM(REG_REG), ENUM(REG_SMOOTH), - ENUM(REG_SHARP), ENUM(SMOOTH_REG), - ENUM(SMOOTH_SMOOTH), ENUM(SMOOTH_SHARP), - ENUM(SHARP_REG), ENUM(SHARP_SMOOTH), - ENUM(SHARP_SHARP), LAST_ENUM }; - -const map_entry prediction_mode_map[] = { - ENUM(DC_PRED), ENUM(V_PRED), ENUM(H_PRED), - ENUM(D45_PRED), ENUM(D135_PRED), ENUM(D113_PRED), - ENUM(D157_PRED), ENUM(D203_PRED), ENUM(D67_PRED), - ENUM(SMOOTH_PRED), ENUM(SMOOTH_V_PRED), ENUM(SMOOTH_H_PRED), - ENUM(PAETH_PRED), ENUM(NEARESTMV), ENUM(NEARMV), - ENUM(GLOBALMV), ENUM(NEWMV), ENUM(NEAREST_NEARESTMV), - ENUM(NEAR_NEARMV), ENUM(NEAREST_NEWMV), ENUM(NEW_NEARESTMV), - ENUM(NEAR_NEWMV), ENUM(NEW_NEARMV), ENUM(GLOBAL_GLOBALMV), - ENUM(NEW_NEWMV), ENUM(INTRA_INVALID), LAST_ENUM -}; - -const map_entry uv_prediction_mode_map[] = { - ENUM(UV_DC_PRED), ENUM(UV_V_PRED), - ENUM(UV_H_PRED), ENUM(UV_D45_PRED), - ENUM(UV_D135_PRED), ENUM(UV_D113_PRED), - ENUM(UV_D157_PRED), ENUM(UV_D203_PRED), - ENUM(UV_D67_PRED), ENUM(UV_SMOOTH_PRED), - ENUM(UV_SMOOTH_V_PRED), ENUM(UV_SMOOTH_H_PRED), - ENUM(UV_PAETH_PRED), ENUM(UV_CFL_PRED), - ENUM(UV_MODE_INVALID), LAST_ENUM -}; -#define NO_SKIP 0 -#define SKIP 1 - -const map_entry skip_map[] = { ENUM(SKIP), ENUM(NO_SKIP), LAST_ENUM }; - -const map_entry config_map[] = { ENUM(MI_SIZE), LAST_ENUM }; - -static const char *exec_name; - -insp_frame_data frame_data; -int frame_count = 0; -int decoded_frame_count = 0; -aom_codec_ctx_t codec; -AvxVideoReader *reader = NULL; -const AvxVideoInfo *info = NULL; -aom_image_t *img = NULL; - -void on_frame_decoded_dump(char *json) { -#ifdef __EMSCRIPTEN__ - EM_ASM_({ Module.on_frame_decoded_json($0); }, json); -#else - printf("%s", json); -#endif -} - -// Writing out the JSON buffer using snprintf is very slow, especially when -// compiled with emscripten, these functions speed things up quite a bit. -int put_str(char *buffer, const char *str) { - int i; - for (i = 0; str[i] != '\0'; i++) { - buffer[i] = str[i]; - } - return i; -} - -int put_str_with_escape(char *buffer, const char *str) { - int i; - int j = 0; - for (i = 0; str[i] != '\0'; i++) { - if (str[i] < ' ') { - continue; - } else if (str[i] == '"' || str[i] == '\\') { - buffer[j++] = '\\'; - } - buffer[j++] = str[i]; - } - return j; -} - -int put_num(char *buffer, char prefix, int num, char suffix) { - int i = 0; - char *buf = buffer; - int is_neg = 0; - if (prefix) { - buf[i++] = prefix; - } - if (num == 0) { - buf[i++] = '0'; - } else { - if (num < 0) { - num = -num; - is_neg = 1; - } - int s = i; - while (num != 0) { - buf[i++] = '0' + (num % 10); - num = num / 10; - } - if (is_neg) { - buf[i++] = '-'; - } - int e = i - 1; - while (s < e) { - int t = buf[s]; - buf[s] = buf[e]; - buf[e] = t; - s++; - e--; - } - } - if (suffix) { - buf[i++] = suffix; - } - return i; -} - -int put_map(char *buffer, const map_entry *map) { - char *buf = buffer; - const map_entry *entry = map; - while (entry->name != NULL) { - *(buf++) = '"'; - buf += put_str(buf, entry->name); - *(buf++) = '"'; - buf += put_num(buf, ':', entry->value, 0); - entry++; - if (entry->name != NULL) { - *(buf++) = ','; - } - } - return (int)(buf - buffer); -} - -int put_reference_frame(char *buffer) { - const int mi_rows = frame_data.mi_rows; - const int mi_cols = frame_data.mi_cols; - char *buf = buffer; - int r, c, t; - buf += put_str(buf, " \"referenceFrameMap\": {"); - buf += put_map(buf, refs_map); - buf += put_str(buf, "},\n"); - buf += put_str(buf, " \"referenceFrame\": ["); - for (r = 0; r < mi_rows; ++r) { - *(buf++) = '['; - for (c = 0; c < mi_cols; ++c) { - insp_mi_data *mi = &frame_data.mi_grid[r * mi_cols + c]; - buf += put_num(buf, '[', mi->ref_frame[0], 0); - buf += put_num(buf, ',', mi->ref_frame[1], ']'); - if (compress) { // RLE - for (t = c + 1; t < mi_cols; ++t) { - insp_mi_data *next_mi = &frame_data.mi_grid[r * mi_cols + t]; - if (mi->ref_frame[0] != next_mi->ref_frame[0] || - mi->ref_frame[1] != next_mi->ref_frame[1]) { - break; - } - } - if (t - c > 1) { - *(buf++) = ','; - buf += put_num(buf, '[', t - c - 1, ']'); - c = t - 1; - } - } - if (c < mi_cols - 1) *(buf++) = ','; - } - *(buf++) = ']'; - if (r < mi_rows - 1) *(buf++) = ','; - } - buf += put_str(buf, "],\n"); - return (int)(buf - buffer); -} - -int put_motion_vectors(char *buffer) { - const int mi_rows = frame_data.mi_rows; - const int mi_cols = frame_data.mi_cols; - char *buf = buffer; - int r, c, t; - buf += put_str(buf, " \"motionVectors\": ["); - for (r = 0; r < mi_rows; ++r) { - *(buf++) = '['; - for (c = 0; c < mi_cols; ++c) { - insp_mi_data *mi = &frame_data.mi_grid[r * mi_cols + c]; - buf += put_num(buf, '[', mi->mv[0].col, 0); - buf += put_num(buf, ',', mi->mv[0].row, 0); - buf += put_num(buf, ',', mi->mv[1].col, 0); - buf += put_num(buf, ',', mi->mv[1].row, ']'); - if (compress) { // RLE - for (t = c + 1; t < mi_cols; ++t) { - insp_mi_data *next_mi = &frame_data.mi_grid[r * mi_cols + t]; - if (mi->mv[0].col != next_mi->mv[0].col || - mi->mv[0].row != next_mi->mv[0].row || - mi->mv[1].col != next_mi->mv[1].col || - mi->mv[1].row != next_mi->mv[1].row) { - break; - } - } - if (t - c > 1) { - *(buf++) = ','; - buf += put_num(buf, '[', t - c - 1, ']'); - c = t - 1; - } - } - if (c < mi_cols - 1) *(buf++) = ','; - } - *(buf++) = ']'; - if (r < mi_rows - 1) *(buf++) = ','; - } - buf += put_str(buf, "],\n"); - return (int)(buf - buffer); -} - -int put_block_info(char *buffer, const map_entry *map, const char *name, - size_t offset, int len) { - const int mi_rows = frame_data.mi_rows; - const int mi_cols = frame_data.mi_cols; - char *buf = buffer; - int r, c, t, i; - if (compress && len == 1) { - die("Can't encode scalars as arrays when RLE compression is enabled."); - return -1; - } - if (map) { - buf += snprintf(buf, MAX_BUFFER, " \"%sMap\": {", name); - buf += put_map(buf, map); - buf += put_str(buf, "},\n"); - } - buf += snprintf(buf, MAX_BUFFER, " \"%s\": [", name); - for (r = 0; r < mi_rows; ++r) { - *(buf++) = '['; - for (c = 0; c < mi_cols; ++c) { - insp_mi_data *mi = &frame_data.mi_grid[r * mi_cols + c]; - int16_t *v = (int16_t *)(((int8_t *)mi) + offset); - if (len == 0) { - buf += put_num(buf, 0, v[0], 0); - } else { - buf += put_str(buf, "["); - for (i = 0; i < len; i++) { - buf += put_num(buf, 0, v[i], 0); - if (i < len - 1) { - buf += put_str(buf, ","); - } - } - buf += put_str(buf, "]"); - } - if (compress) { // RLE - for (t = c + 1; t < mi_cols; ++t) { - insp_mi_data *next_mi = &frame_data.mi_grid[r * mi_cols + t]; - int16_t *nv = (int16_t *)(((int8_t *)next_mi) + offset); - int same = 0; - if (len == 0) { - same = v[0] == nv[0]; - } else { - for (i = 0; i < len; i++) { - same = v[i] == nv[i]; - if (!same) { - break; - } - } - } - if (!same) { - break; - } - } - if (t - c > 1) { - *(buf++) = ','; - buf += put_num(buf, '[', t - c - 1, ']'); - c = t - 1; - } - } - if (c < mi_cols - 1) *(buf++) = ','; - } - *(buf++) = ']'; - if (r < mi_rows - 1) *(buf++) = ','; - } - buf += put_str(buf, "],\n"); - return (int)(buf - buffer); -} - -#if CONFIG_ACCOUNTING -int put_accounting(char *buffer) { - char *buf = buffer; - int i; - const Accounting *accounting = frame_data.accounting; - if (accounting == NULL) { - printf("XXX\n"); - return 0; - } - const int num_syms = accounting->syms.num_syms; - const int num_strs = accounting->syms.dictionary.num_strs; - buf += put_str(buf, " \"symbolsMap\": ["); - for (i = 0; i < num_strs; i++) { - buf += snprintf(buf, MAX_BUFFER, "\"%s\"", - accounting->syms.dictionary.strs[i]); - if (i < num_strs - 1) *(buf++) = ','; - } - buf += put_str(buf, "],\n"); - buf += put_str(buf, " \"symbols\": [\n "); - AccountingSymbolContext context; - context.x = -2; - context.y = -2; - AccountingSymbol *sym; - for (i = 0; i < num_syms; i++) { - sym = &accounting->syms.syms[i]; - if (memcmp(&context, &sym->context, sizeof(AccountingSymbolContext)) != 0) { - buf += put_num(buf, '[', sym->context.x, 0); - buf += put_num(buf, ',', sym->context.y, ']'); - } else { - buf += put_num(buf, '[', sym->id, 0); - buf += put_num(buf, ',', sym->bits, 0); - buf += put_num(buf, ',', sym->samples, ']'); - } - context = sym->context; - if (i < num_syms - 1) *(buf++) = ','; - } - buf += put_str(buf, "],\n"); - return (int)(buf - buffer); -} -#endif - -void inspect(void *pbi, void *data) { - /* Fetch frame data. */ - ifd_inspect(&frame_data, pbi); - (void)data; - // We allocate enough space and hope we don't write out of bounds. Totally - // unsafe but this speeds things up, especially when compiled to Javascript. - char *buffer = aom_malloc(MAX_BUFFER); - char *buf = buffer; - buf += put_str(buf, "{\n"); - if (layers & BLOCK_SIZE_LAYER) { - buf += put_block_info(buf, block_size_map, "blockSize", - offsetof(insp_mi_data, sb_type), 0); - } - if (layers & TRANSFORM_SIZE_LAYER) { - buf += put_block_info(buf, tx_size_map, "transformSize", - offsetof(insp_mi_data, tx_size), 0); - } - if (layers & TRANSFORM_TYPE_LAYER) { - buf += put_block_info(buf, tx_type_map, "transformType", - offsetof(insp_mi_data, tx_type), 0); - } - if (layers & DUAL_FILTER_LAYER) { - buf += put_block_info(buf, dual_filter_map, "dualFilterType", - offsetof(insp_mi_data, dual_filter_type), 0); - } - if (layers & MODE_LAYER) { - buf += put_block_info(buf, prediction_mode_map, "mode", - offsetof(insp_mi_data, mode), 0); - } - if (layers & UV_MODE_LAYER) { - buf += put_block_info(buf, uv_prediction_mode_map, "uv_mode", - offsetof(insp_mi_data, uv_mode), 0); - } - if (layers & SKIP_LAYER) { - buf += - put_block_info(buf, skip_map, "skip", offsetof(insp_mi_data, skip), 0); - } - if (layers & FILTER_LAYER) { - buf += - put_block_info(buf, NULL, "filter", offsetof(insp_mi_data, filter), 2); - } - if (layers & CDEF_LAYER) { - buf += put_block_info(buf, NULL, "cdef_level", - offsetof(insp_mi_data, cdef_level), 0); - buf += put_block_info(buf, NULL, "cdef_strength", - offsetof(insp_mi_data, cdef_strength), 0); - } - if (layers & CFL_LAYER) { - buf += put_block_info(buf, NULL, "cfl_alpha_idx", - offsetof(insp_mi_data, cfl_alpha_idx), 0); - buf += put_block_info(buf, NULL, "cfl_alpha_sign", - offsetof(insp_mi_data, cfl_alpha_sign), 0); - } - if (layers & Q_INDEX_LAYER) { - buf += put_block_info(buf, NULL, "delta_q", - offsetof(insp_mi_data, current_qindex), 0); - } - if (layers & SEGMENT_ID_LAYER) { - buf += put_block_info(buf, NULL, "seg_id", - offsetof(insp_mi_data, segment_id), 0); - } - if (layers & MOTION_VECTORS_LAYER) { - buf += put_motion_vectors(buf); - } - if (layers & REFERENCE_FRAME_LAYER) { - buf += put_block_info(buf, refs_map, "referenceFrame", - offsetof(insp_mi_data, ref_frame), 2); - } -#if CONFIG_ACCOUNTING - if (layers & ACCOUNTING_LAYER) { - buf += put_accounting(buf); - } -#endif - buf += snprintf(buf, MAX_BUFFER, " \"frame\": %d,\n", decoded_frame_count); - buf += snprintf(buf, MAX_BUFFER, " \"showFrame\": %d,\n", - frame_data.show_frame); - buf += snprintf(buf, MAX_BUFFER, " \"frameType\": %d,\n", - frame_data.frame_type); - buf += snprintf(buf, MAX_BUFFER, " \"baseQIndex\": %d,\n", - frame_data.base_qindex); - buf += snprintf(buf, MAX_BUFFER, " \"tileCols\": %d,\n", - frame_data.tile_mi_cols); - buf += snprintf(buf, MAX_BUFFER, " \"tileRows\": %d,\n", - frame_data.tile_mi_rows); - buf += snprintf(buf, MAX_BUFFER, " \"deltaQPresentFlag\": %d,\n", - frame_data.delta_q_present_flag); - buf += snprintf(buf, MAX_BUFFER, " \"deltaQRes\": %d,\n", - frame_data.delta_q_res); - buf += put_str(buf, " \"config\": {"); - buf += put_map(buf, config_map); - buf += put_str(buf, "},\n"); - buf += put_str(buf, " \"configString\": \""); - buf += put_str_with_escape(buf, aom_codec_build_config()); - buf += put_str(buf, "\"\n"); - decoded_frame_count++; - buf += put_str(buf, "},\n"); - *(buf++) = 0; - on_frame_decoded_dump(buffer); - aom_free(buffer); -} - -void ifd_init_cb() { - aom_inspect_init ii; - ii.inspect_cb = inspect; - ii.inspect_ctx = NULL; - aom_codec_control(&codec, AV1_SET_INSPECTION_CALLBACK, &ii); -} - -EMSCRIPTEN_KEEPALIVE -int open_file(char *file) { - if (file == NULL) { - // The JS analyzer puts the .ivf file at this location. - file = "/tmp/input.ivf"; - } - reader = aom_video_reader_open(file); - if (!reader) die("Failed to open %s for reading.", file); - info = aom_video_reader_get_info(reader); - const AvxInterface *decoder = get_aom_decoder_by_fourcc(info->codec_fourcc); - if (!decoder) die("Unknown input codec."); - fprintf(stderr, "Using %s\n", - aom_codec_iface_name(decoder->codec_interface())); - if (aom_codec_dec_init(&codec, decoder->codec_interface(), NULL, 0)) - die_codec(&codec, "Failed to initialize decoder."); - ifd_init(&frame_data, info->frame_width, info->frame_height); - ifd_init_cb(); - return EXIT_SUCCESS; -} - -EMSCRIPTEN_KEEPALIVE -int read_frame() { - if (!aom_video_reader_read_frame(reader)) return EXIT_FAILURE; - img = NULL; - aom_codec_iter_t iter = NULL; - size_t frame_size = 0; - const unsigned char *frame = aom_video_reader_get_frame(reader, &frame_size); - if (aom_codec_decode(&codec, frame, (unsigned int)frame_size, NULL) != - AOM_CODEC_OK) { - die_codec(&codec, "Failed to decode frame."); - } - int got_any_frames = 0; - aom_image_t *frame_img; - while ((frame_img = aom_codec_get_frame(&codec, &iter))) { - img = frame_img; - ++frame_count; - got_any_frames = 1; - } - if (!got_any_frames) { - return EXIT_FAILURE; - } - return EXIT_SUCCESS; -} - -EMSCRIPTEN_KEEPALIVE -const char *get_aom_codec_build_config() { return aom_codec_build_config(); } - -EMSCRIPTEN_KEEPALIVE -int get_bit_depth() { return img->bit_depth; } - -EMSCRIPTEN_KEEPALIVE -int get_bits_per_sample() { return img->bps; } - -EMSCRIPTEN_KEEPALIVE -int get_image_format() { return img->fmt; } - -EMSCRIPTEN_KEEPALIVE -unsigned char *get_plane(int plane) { return img->planes[plane]; } - -EMSCRIPTEN_KEEPALIVE -int get_plane_stride(int plane) { return img->stride[plane]; } - -EMSCRIPTEN_KEEPALIVE -int get_plane_width(int plane) { return aom_img_plane_width(img, plane); } - -EMSCRIPTEN_KEEPALIVE -int get_plane_height(int plane) { return aom_img_plane_height(img, plane); } - -EMSCRIPTEN_KEEPALIVE -int get_frame_width() { return info->frame_width; } - -EMSCRIPTEN_KEEPALIVE -int get_frame_height() { return info->frame_height; } - -static void parse_args(char **argv) { - char **argi, **argj; - struct arg arg; - (void)dump_accounting_arg; - (void)dump_cdef_arg; - for (argi = argj = argv; (*argj = *argi); argi += arg.argv_step) { - arg.argv_step = 1; - if (arg_match(&arg, &dump_block_size_arg, argi)) layers |= BLOCK_SIZE_LAYER; -#if CONFIG_ACCOUNTING - else if (arg_match(&arg, &dump_accounting_arg, argi)) - layers |= ACCOUNTING_LAYER; -#endif - else if (arg_match(&arg, &dump_transform_size_arg, argi)) - layers |= TRANSFORM_SIZE_LAYER; - else if (arg_match(&arg, &dump_transform_type_arg, argi)) - layers |= TRANSFORM_TYPE_LAYER; - else if (arg_match(&arg, &dump_mode_arg, argi)) - layers |= MODE_LAYER; - else if (arg_match(&arg, &dump_uv_mode_arg, argi)) - layers |= UV_MODE_LAYER; - else if (arg_match(&arg, &dump_skip_arg, argi)) - layers |= SKIP_LAYER; - else if (arg_match(&arg, &dump_filter_arg, argi)) - layers |= FILTER_LAYER; - else if (arg_match(&arg, &dump_cdef_arg, argi)) - layers |= CDEF_LAYER; - else if (arg_match(&arg, &dump_cfl_arg, argi)) - layers |= CFL_LAYER; - else if (arg_match(&arg, &dump_reference_frame_arg, argi)) - layers |= REFERENCE_FRAME_LAYER; - else if (arg_match(&arg, &dump_motion_vectors_arg, argi)) - layers |= MOTION_VECTORS_LAYER; - else if (arg_match(&arg, &dump_dual_filter_type_arg, argi)) - layers |= DUAL_FILTER_LAYER; - else if (arg_match(&arg, &dump_delta_q_arg, argi)) - layers |= Q_INDEX_LAYER; - else if (arg_match(&arg, &dump_seg_id_arg, argi)) - layers |= SEGMENT_ID_LAYER; - else if (arg_match(&arg, &dump_all_arg, argi)) - layers |= ALL_LAYERS; - else if (arg_match(&arg, &compress_arg, argi)) - compress = 1; - else if (arg_match(&arg, &usage_arg, argi)) - usage_exit(); - else if (arg_match(&arg, &limit_arg, argi)) - stop_after = arg_parse_uint(&arg); - else - argj++; - } -} - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, "Usage: %s src_filename <options>\n", exec_name); - fprintf(stderr, "\nOptions:\n"); - arg_show_usage(stderr, main_args); - exit(EXIT_FAILURE); -} - -EMSCRIPTEN_KEEPALIVE -int main(int argc, char **argv) { - exec_name = argv[0]; - parse_args(argv); - if (argc >= 2) { - open_file(argv[1]); - printf("[\n"); - while (1) { - if (stop_after && (decoded_frame_count >= stop_after)) break; - if (read_frame()) break; - } - printf("null\n"); - printf("]"); - } else { - usage_exit(); - } -} - -EMSCRIPTEN_KEEPALIVE -void quit() { - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec"); - aom_video_reader_close(reader); -} - -EMSCRIPTEN_KEEPALIVE -void set_layers(LayerType v) { layers = v; } - -EMSCRIPTEN_KEEPALIVE -void set_compress(int v) { compress = v; } diff --git a/third_party/aom/examples/lightfield_bitstream_parsing.c b/third_party/aom/examples/lightfield_bitstream_parsing.c deleted file mode 100644 index 159f1617a..000000000 --- a/third_party/aom/examples/lightfield_bitstream_parsing.c +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Lightfield Bitstream Parsing -// ============================ -// -// This is a lightfield bitstream parsing example. It takes an input file -// containing the whole compressed lightfield bitstream(ivf file), and parses it -// and constructs and outputs a new bitstream that can be decoded by an AV1 -// decoder. The output bitstream contains reference frames(i.e. anchor frames), -// camera frame header, and tile list OBUs. num_references is the number of -// anchor frames coded at the beginning of the light field file. -// After running the lightfield encoder, run lightfield bitstream parsing: -// examples/lightfield_bitstream_parsing vase10x10.ivf vase_tile_list.ivf 4 - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_decoder.h" -#include "aom/aom_encoder.h" -#include "aom/aom_integer.h" -#include "aom/aomdx.h" -#include "aom_dsp/bitwriter_buffer.h" -#include "common/tools_common.h" -#include "common/video_reader.h" -#include "common/video_writer.h" - -#define MAX_TILES 512 - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, "Usage: %s <infile> <outfile> <num_references> \n", - exec_name); - exit(EXIT_FAILURE); -} - -#define ALIGN_POWER_OF_TWO(value, n) \ - (((value) + ((1 << (n)) - 1)) & ~((1 << (n)) - 1)) - -// SB size: 64x64 -const uint8_t output_frame_width_in_tiles_minus_1 = 512 / 64 - 1; -const uint8_t output_frame_height_in_tiles_minus_1 = 512 / 64 - 1; - -// Spec: -// typedef struct { -// uint8_t anchor_frame_idx; -// uint8_t tile_row; -// uint8_t tile_col; -// uint16_t coded_tile_data_size_minus_1; -// uint8_t *coded_tile_data; -// } TILE_LIST_ENTRY; - -// Tile list entry provided by the application -typedef struct { - int image_idx; - int reference_idx; - int tile_col; - int tile_row; -} TILE_LIST_INFO; - -// M references: 0 - M-1; N images(including references): 0 - N-1; -// Note: order the image index incrementally, so that we only go through the -// bitstream once to construct the tile list. -const int num_tile_lists = 2; -const uint16_t tile_count_minus_1 = 9 - 1; -const TILE_LIST_INFO tile_list[2][9] = { - { { 16, 0, 4, 5 }, - { 83, 3, 13, 2 }, - { 57, 2, 2, 6 }, - { 31, 1, 11, 5 }, - { 2, 0, 7, 4 }, - { 77, 3, 9, 9 }, - { 49, 1, 0, 1 }, - { 6, 0, 3, 10 }, - { 63, 2, 5, 8 } }, - { { 65, 2, 11, 1 }, - { 42, 1, 3, 7 }, - { 88, 3, 8, 4 }, - { 76, 3, 1, 15 }, - { 1, 0, 2, 2 }, - { 19, 0, 5, 6 }, - { 60, 2, 4, 0 }, - { 25, 1, 11, 15 }, - { 50, 2, 5, 4 } }, -}; - -static int get_image_bps(aom_img_fmt_t fmt) { - switch (fmt) { - case AOM_IMG_FMT_I420: return 12; - case AOM_IMG_FMT_I422: return 16; - case AOM_IMG_FMT_I444: return 24; - case AOM_IMG_FMT_I42016: return 24; - case AOM_IMG_FMT_I42216: return 32; - case AOM_IMG_FMT_I44416: return 48; - default: die("Invalid image format"); - } - return 0; -} - -int main(int argc, char **argv) { - aom_codec_ctx_t codec; - AvxVideoReader *reader = NULL; - AvxVideoWriter *writer = NULL; - const AvxInterface *decoder = NULL; - const AvxVideoInfo *info = NULL; - int num_references; - int n, i; - aom_codec_pts_t pts; - - exec_name = argv[0]; - if (argc != 4) die("Invalid number of arguments."); - - reader = aom_video_reader_open(argv[1]); - if (!reader) die("Failed to open %s for reading.", argv[1]); - - num_references = (int)strtol(argv[3], NULL, 0); - info = aom_video_reader_get_info(reader); - - // The writer to write out ivf file in tile list OBU, which can be decoded by - // AV1 decoder. - writer = aom_video_writer_open(argv[2], kContainerIVF, info); - if (!writer) die("Failed to open %s for writing", argv[2]); - - decoder = get_aom_decoder_by_fourcc(info->codec_fourcc); - if (!decoder) die("Unknown input codec."); - printf("Using %s\n", aom_codec_iface_name(decoder->codec_interface())); - - if (aom_codec_dec_init(&codec, decoder->codec_interface(), NULL, 0)) - die_codec(&codec, "Failed to initialize decoder."); - - // Decode anchor frames. - aom_codec_control_(&codec, AV1_SET_TILE_MODE, 0); - - for (i = 0; i < num_references; ++i) { - aom_video_reader_read_frame(reader); - - size_t frame_size = 0; - const unsigned char *frame = - aom_video_reader_get_frame(reader, &frame_size); - pts = (aom_codec_pts_t)aom_video_reader_get_frame_pts(reader); - - // Copy references bitstream directly. - if (!aom_video_writer_write_frame(writer, frame, frame_size, pts)) - die_codec(&codec, "Failed to copy compressed anchor frame."); - - if (aom_codec_decode(&codec, frame, frame_size, NULL)) - die_codec(&codec, "Failed to decode frame."); - } - - // Decode camera frames. - aom_codec_control_(&codec, AV1_SET_TILE_MODE, 1); - aom_codec_control_(&codec, AV1D_EXT_TILE_DEBUG, 1); - - FILE *infile = aom_video_reader_get_file(reader); - // Record the offset of the first camera image. - const FileOffset camera_frame_pos = ftello(infile); - - // Read out the first camera frame. - aom_video_reader_read_frame(reader); - - // Copy first camera frame for getting camera frame header. This is done - // only once. - { - size_t frame_size = 0; - const unsigned char *frame = - aom_video_reader_get_frame(reader, &frame_size); - pts = (aom_codec_pts_t)aom_video_reader_get_frame_pts(reader); - aom_tile_data frame_header_info = { 0, NULL, 0 }; - - // Need to decode frame header to get camera frame header info. So, here - // decoding 1 tile is enough. - aom_codec_control_(&codec, AV1_SET_DECODE_TILE_ROW, 0); - aom_codec_control_(&codec, AV1_SET_DECODE_TILE_COL, 0); - - aom_codec_err_t aom_status = - aom_codec_decode(&codec, frame, frame_size, NULL); - if (aom_status) die_codec(&codec, "Failed to decode tile."); - - aom_codec_control_(&codec, AV1D_GET_FRAME_HEADER_INFO, &frame_header_info); - - size_t obu_size_offset = - (uint8_t *)frame_header_info.coded_tile_data - frame; - size_t length_field_size = frame_header_info.coded_tile_data_size; - // Remove ext-tile tile info. - uint32_t frame_header_size = (uint32_t)frame_header_info.extra_size - 1; - size_t bytes_to_copy = - obu_size_offset + length_field_size + frame_header_size; - - unsigned char *frame_hdr_buf = (unsigned char *)malloc(bytes_to_copy); - if (frame_hdr_buf == NULL) - die_codec(&codec, "Failed to allocate frame header buffer."); - - memcpy(frame_hdr_buf, frame, bytes_to_copy); - - // Update frame header OBU size. - size_t bytes_written = 0; - if (aom_uleb_encode_fixed_size( - frame_header_size, length_field_size, length_field_size, - frame_hdr_buf + obu_size_offset, &bytes_written)) - die_codec(&codec, "Failed to encode the tile list obu size."); - - // Copy camera frame header bitstream. - if (!aom_video_writer_write_frame(writer, frame_hdr_buf, bytes_to_copy, - pts)) - die_codec(&codec, "Failed to copy compressed camera frame header."); - free(frame_hdr_buf); - } - - // Read out the image format. - aom_img_fmt_t ref_fmt = 0; - if (aom_codec_control(&codec, AV1D_GET_IMG_FORMAT, &ref_fmt)) - die_codec(&codec, "Failed to get the image format"); - const int bps = get_image_bps(ref_fmt); - if (!bps) die_codec(&codec, "Invalid image format."); - // read out the tile size. - unsigned int tile_size = 0; - if (aom_codec_control(&codec, AV1D_GET_TILE_SIZE, &tile_size)) - die_codec(&codec, "Failed to get the tile size"); - const unsigned int tile_width = tile_size >> 16; - const unsigned int tile_height = tile_size & 65535; - // Allocate a buffer to store tile list bitstream. - const size_t data_sz = MAX_TILES * ALIGN_POWER_OF_TWO(tile_width, 5) * - ALIGN_POWER_OF_TWO(tile_height, 5) * bps / 8; - unsigned char *tl_buf = (unsigned char *)malloc(data_sz); - if (tl_buf == NULL) die_codec(&codec, "Failed to allocate tile list buffer."); - - aom_codec_pts_t tl_pts = pts; - - // Process 1 tile list. - for (n = 0; n < num_tile_lists; n++) { - unsigned char *tl = tl_buf; - struct aom_write_bit_buffer wb = { tl, 0 }; - unsigned char *saved_obu_size_loc = NULL; - uint32_t tile_list_obu_header_size = 0; - uint32_t tile_list_obu_size = 0; - - // Write the tile list OBU header that is 1 byte long. - aom_wb_write_literal(&wb, 0, 1); // forbidden bit. - aom_wb_write_literal(&wb, 8, 4); // tile list OBU: "1000" - aom_wb_write_literal(&wb, 0, 1); // obu_extension = 0 - aom_wb_write_literal(&wb, 1, 1); // obu_has_size_field - aom_wb_write_literal(&wb, 0, 1); // reserved - tl++; - tile_list_obu_header_size++; - - // Write the OBU size using a fixed length_field_size of 4 bytes. - saved_obu_size_loc = tl; - // aom_wb_write_unsigned_literal(&wb, data, bits) requires that bits <= 32. - aom_wb_write_unsigned_literal(&wb, 0, 32); - tl += 4; - tile_list_obu_header_size += 4; - - // write_tile_list_obu() - aom_wb_write_literal(&wb, output_frame_width_in_tiles_minus_1, 8); - aom_wb_write_literal(&wb, output_frame_height_in_tiles_minus_1, 8); - aom_wb_write_literal(&wb, tile_count_minus_1, 16); - tl += 4; - tile_list_obu_size += 4; - - // Write each tile's data - for (i = 0; i <= tile_count_minus_1; i++) { - aom_tile_data tile_data = { 0, NULL, 0 }; - - int image_idx = tile_list[n][i].image_idx; - int ref_idx = tile_list[n][i].reference_idx; - int tc = tile_list[n][i].tile_col; - int tr = tile_list[n][i].tile_row; - int frame_cnt = -1; - - // Reset bit writer to the right location. - wb.bit_buffer = tl; - wb.bit_offset = 0; - - // Seek to the first camera image. - fseeko(infile, camera_frame_pos, SEEK_SET); - - // Read out the camera image - while (frame_cnt != image_idx) { - aom_video_reader_read_frame(reader); - frame_cnt++; - } - - size_t frame_size = 0; - const unsigned char *frame = - aom_video_reader_get_frame(reader, &frame_size); - - aom_codec_control_(&codec, AV1_SET_DECODE_TILE_ROW, tr); - aom_codec_control_(&codec, AV1_SET_DECODE_TILE_COL, tc); - - aom_codec_err_t aom_status = - aom_codec_decode(&codec, frame, frame_size, NULL); - if (aom_status) die_codec(&codec, "Failed to decode tile."); - - aom_codec_control_(&codec, AV1D_GET_TILE_DATA, &tile_data); - - // Copy over tile info. - // uint8_t anchor_frame_idx; - // uint8_t tile_row; - // uint8_t tile_col; - // uint16_t coded_tile_data_size_minus_1; - // uint8_t *coded_tile_data; - uint32_t tile_info_bytes = 5; - aom_wb_write_literal(&wb, ref_idx, 8); - aom_wb_write_literal(&wb, tr, 8); - aom_wb_write_literal(&wb, tc, 8); - aom_wb_write_literal(&wb, (int)tile_data.coded_tile_data_size - 1, 16); - tl += tile_info_bytes; - - memcpy(tl, (uint8_t *)tile_data.coded_tile_data, - tile_data.coded_tile_data_size); - tl += tile_data.coded_tile_data_size; - - tile_list_obu_size += - tile_info_bytes + (uint32_t)tile_data.coded_tile_data_size; - } - - // Write tile list OBU size. - size_t bytes_written = 0; - if (aom_uleb_encode_fixed_size(tile_list_obu_size, 4, 4, saved_obu_size_loc, - &bytes_written)) - die_codec(&codec, "Failed to encode the tile list obu size."); - - // Copy the tile list. - if (!aom_video_writer_write_frame( - writer, tl_buf, tile_list_obu_header_size + tile_list_obu_size, - tl_pts)) - die_codec(&codec, "Failed to copy compressed tile list."); - - tl_pts++; - } - - free(tl_buf); - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec"); - aom_video_writer_close(writer); - aom_video_reader_close(reader); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/lightfield_decoder.c b/third_party/aom/examples/lightfield_decoder.c deleted file mode 100644 index f5e54db7f..000000000 --- a/third_party/aom/examples/lightfield_decoder.c +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Lightfield Decoder -// ================== -// -// This is an example of a simple lightfield decoder. It builds upon the -// simple_decoder.c example. It takes an input file containing the compressed -// data (in ivf format), treating it as a lightfield instead of a video. -// After running the lightfield encoder, run lightfield decoder to decode a -// batch of tiles: -// examples/lightfield_decoder vase10x10.ivf vase_reference.yuv 4 - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_decoder.h" -#include "aom/aomdx.h" -#include "aom_scale/yv12config.h" -#include "av1/common/enums.h" -#include "common/tools_common.h" -#include "common/video_reader.h" - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, "Usage: %s <infile> <outfile> <num_references>\n", exec_name); - exit(EXIT_FAILURE); -} - -// Tile list entry provided by the application -typedef struct { - int image_idx; - int reference_idx; - int tile_col; - int tile_row; -} TILE_LIST_INFO; - -// M references: 0 - M-1; N images(including references): 0 - N-1; -// Note: order the image index incrementally, so that we only go through the -// bitstream once to construct the tile list. -const int num_tile_lists = 2; -const uint16_t tile_count_minus_1 = 9 - 1; -const TILE_LIST_INFO tile_list[2][9] = { - { { 16, 0, 4, 5 }, - { 83, 3, 13, 2 }, - { 57, 2, 2, 6 }, - { 31, 1, 11, 5 }, - { 2, 0, 7, 4 }, - { 77, 3, 9, 9 }, - { 49, 1, 0, 1 }, - { 6, 0, 3, 10 }, - { 63, 2, 5, 8 } }, - { { 65, 2, 11, 1 }, - { 42, 1, 3, 7 }, - { 88, 3, 8, 4 }, - { 76, 3, 1, 15 }, - { 1, 0, 2, 2 }, - { 19, 0, 5, 6 }, - { 60, 2, 4, 0 }, - { 25, 1, 11, 15 }, - { 50, 2, 5, 4 } }, -}; - -int main(int argc, char **argv) { - FILE *outfile = NULL; - aom_codec_ctx_t codec; - AvxVideoReader *reader = NULL; - const AvxInterface *decoder = NULL; - const AvxVideoInfo *info = NULL; - int num_references; - aom_image_t reference_images[MAX_EXTERNAL_REFERENCES]; - size_t frame_size = 0; - const unsigned char *frame = NULL; - int n, i, j; - exec_name = argv[0]; - - if (argc != 4) die("Invalid number of arguments."); - - reader = aom_video_reader_open(argv[1]); - if (!reader) die("Failed to open %s for reading.", argv[1]); - - if (!(outfile = fopen(argv[2], "wb"))) - die("Failed to open %s for writing.", argv[2]); - - num_references = (int)strtol(argv[3], NULL, 0); - - info = aom_video_reader_get_info(reader); - - decoder = get_aom_decoder_by_fourcc(info->codec_fourcc); - if (!decoder) die("Unknown input codec."); - printf("Using %s\n", aom_codec_iface_name(decoder->codec_interface())); - - if (aom_codec_dec_init(&codec, decoder->codec_interface(), NULL, 0)) - die_codec(&codec, "Failed to initialize decoder."); - - if (aom_codec_control(&codec, AV1D_SET_IS_ANNEXB, info->is_annexb)) { - die("Failed to set annex b status"); - } - - // Decode anchor frames. - aom_codec_control_(&codec, AV1_SET_TILE_MODE, 0); - for (i = 0; i < num_references; ++i) { - aom_video_reader_read_frame(reader); - frame = aom_video_reader_get_frame(reader, &frame_size); - if (aom_codec_decode(&codec, frame, frame_size, NULL)) - die_codec(&codec, "Failed to decode frame."); - - if (i == 0) { - aom_img_fmt_t ref_fmt = 0; - if (aom_codec_control(&codec, AV1D_GET_IMG_FORMAT, &ref_fmt)) - die_codec(&codec, "Failed to get the image format"); - - int frame_res[2]; - if (aom_codec_control(&codec, AV1D_GET_FRAME_SIZE, frame_res)) - die_codec(&codec, "Failed to get the image frame size"); - - // Allocate memory to store decoded references. Allocate memory with the - // border so that it can be used as a reference. - for (j = 0; j < num_references; j++) { - unsigned int border = AOM_BORDER_IN_PIXELS; - if (!aom_img_alloc_with_border(&reference_images[j], ref_fmt, - frame_res[0], frame_res[1], 32, 8, - border)) { - die("Failed to allocate references."); - } - } - } - - if (aom_codec_control(&codec, AV1_COPY_NEW_FRAME_IMAGE, - &reference_images[i])) - die_codec(&codec, "Failed to copy decoded reference frame"); - - aom_codec_iter_t iter = NULL; - aom_image_t *img = NULL; - while ((img = aom_codec_get_frame(&codec, &iter)) != NULL) { - char name[1024]; - snprintf(name, sizeof(name), "ref_%d.yuv", i); - printf("writing ref image to %s, %d, %d\n", name, img->d_w, img->d_h); - FILE *ref_file = fopen(name, "wb"); - aom_img_write(img, ref_file); - fclose(ref_file); - } - } - - FILE *infile = aom_video_reader_get_file(reader); - // Record the offset of the first camera image. - const FileOffset camera_frame_pos = ftello(infile); - - // Process 1 tile. - for (n = 0; n < num_tile_lists; n++) { - for (i = 0; i <= tile_count_minus_1; i++) { - int image_idx = tile_list[n][i].image_idx; - int ref_idx = tile_list[n][i].reference_idx; - int tc = tile_list[n][i].tile_col; - int tr = tile_list[n][i].tile_row; - int frame_cnt = -1; - - // Seek to the first camera image. - fseeko(infile, camera_frame_pos, SEEK_SET); - - // Read out the camera image - while (frame_cnt != image_idx) { - aom_video_reader_read_frame(reader); - frame_cnt++; - } - - frame = aom_video_reader_get_frame(reader, &frame_size); - - aom_codec_control_(&codec, AV1_SET_TILE_MODE, 1); - aom_codec_control_(&codec, AV1D_EXT_TILE_DEBUG, 1); - aom_codec_control_(&codec, AV1_SET_DECODE_TILE_ROW, tr); - aom_codec_control_(&codec, AV1_SET_DECODE_TILE_COL, tc); - - av1_ref_frame_t ref; - ref.idx = 0; - ref.use_external_ref = 1; - ref.img = reference_images[ref_idx]; - if (aom_codec_control(&codec, AV1_SET_REFERENCE, &ref)) { - die_codec(&codec, "Failed to set reference frame."); - } - - aom_codec_err_t aom_status = - aom_codec_decode(&codec, frame, frame_size, NULL); - if (aom_status) die_codec(&codec, "Failed to decode tile."); - - aom_codec_iter_t iter = NULL; - aom_image_t *img = aom_codec_get_frame(&codec, &iter); - aom_img_write(img, outfile); - } - } - - for (i = 0; i < num_references; i++) aom_img_free(&reference_images[i]); - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec"); - aom_video_reader_close(reader); - fclose(outfile); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/lightfield_encoder.c b/third_party/aom/examples/lightfield_encoder.c deleted file mode 100644 index e55cd5ce3..000000000 --- a/third_party/aom/examples/lightfield_encoder.c +++ /dev/null @@ -1,499 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Lightfield Encoder -// ================== -// -// This is an example of a simple lightfield encoder. It builds upon the -// twopass_encoder.c example. It takes an input file in YV12 format, -// treating it as a planar lightfield instead of a video. The img_width -// and img_height arguments are the dimensions of the lightfield images, -// while the lf_width and lf_height arguments are the number of -// lightfield images in each dimension. The lf_blocksize determines the -// number of reference images used for MCP. For example, 5 means that there -// is a reference image for every 5x5 lightfield image block. All images -// within a block will use the center image in that block as the reference -// image for MCP. -// Run "make test" to download lightfield test data: vase10x10.yuv. -// Run lightfield encoder to encode whole lightfield: -// examples/lightfield_encoder 1024 1024 vase10x10.yuv vase10x10.ivf 10 10 5 - -// Note: In bitstream.c and encoder.c, define EXT_TILE_DEBUG as 1 will print -// out the uncompressed header and the frame contexts, which can be used to -// test the bit exactness of the headers and the frame contexts for large scale -// tile coded frames. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_encoder.h" -#include "aom/aomcx.h" -#include "aom_scale/yv12config.h" -#include "av1/common/enums.h" -#include "common/tools_common.h" -#include "common/video_writer.h" - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, - "Usage: %s <img_width> <img_height> <infile> <outfile> " - "<lf_width> <lf_height> <lf_blocksize>\n", - exec_name); - exit(EXIT_FAILURE); -} - -static int aom_img_size_bytes(aom_image_t *img) { - int image_size_bytes = 0; - int plane; - for (plane = 0; plane < 3; ++plane) { - const int w = aom_img_plane_width(img, plane) * - ((img->fmt & AOM_IMG_FMT_HIGHBITDEPTH) ? 2 : 1); - const int h = aom_img_plane_height(img, plane); - image_size_bytes += w * h; - } - return image_size_bytes; -} - -static int get_frame_stats(aom_codec_ctx_t *ctx, const aom_image_t *img, - aom_codec_pts_t pts, unsigned int duration, - aom_enc_frame_flags_t flags, - aom_fixed_buf_t *stats) { - int got_pkts = 0; - aom_codec_iter_t iter = NULL; - const aom_codec_cx_pkt_t *pkt = NULL; - const aom_codec_err_t res = aom_codec_encode(ctx, img, pts, duration, flags); - if (res != AOM_CODEC_OK) die_codec(ctx, "Failed to get frame stats."); - - while ((pkt = aom_codec_get_cx_data(ctx, &iter)) != NULL) { - got_pkts = 1; - - if (pkt->kind == AOM_CODEC_STATS_PKT) { - const uint8_t *const pkt_buf = pkt->data.twopass_stats.buf; - const size_t pkt_size = pkt->data.twopass_stats.sz; - stats->buf = realloc(stats->buf, stats->sz + pkt_size); - memcpy((uint8_t *)stats->buf + stats->sz, pkt_buf, pkt_size); - stats->sz += pkt_size; - } - } - - return got_pkts; -} - -static int encode_frame(aom_codec_ctx_t *ctx, const aom_image_t *img, - aom_codec_pts_t pts, unsigned int duration, - aom_enc_frame_flags_t flags, AvxVideoWriter *writer) { - int got_pkts = 0; - aom_codec_iter_t iter = NULL; - const aom_codec_cx_pkt_t *pkt = NULL; - const aom_codec_err_t res = aom_codec_encode(ctx, img, pts, duration, flags); - if (res != AOM_CODEC_OK) die_codec(ctx, "Failed to encode frame."); - - while ((pkt = aom_codec_get_cx_data(ctx, &iter)) != NULL) { - got_pkts = 1; - if (pkt->kind == AOM_CODEC_CX_FRAME_PKT) { - const int keyframe = (pkt->data.frame.flags & AOM_FRAME_IS_KEY) != 0; - - if (!aom_video_writer_write_frame(writer, pkt->data.frame.buf, - pkt->data.frame.sz, - pkt->data.frame.pts)) - die_codec(ctx, "Failed to write compressed frame."); - printf(keyframe ? "K" : "."); - fflush(stdout); - } - } - - return got_pkts; -} - -static void get_raw_image(aom_image_t **frame_to_encode, aom_image_t *raw, - aom_image_t *raw_shift) { - if (!CONFIG_LOWBITDEPTH) { - // Need to allocate larger buffer to use hbd internal. - int input_shift = 0; - aom_img_upshift(raw_shift, raw, input_shift); - *frame_to_encode = raw_shift; - } else { - *frame_to_encode = raw; - } -} - -static aom_fixed_buf_t pass0(aom_image_t *raw, FILE *infile, - const AvxInterface *encoder, - const aom_codec_enc_cfg_t *cfg, int lf_width, - int lf_height, int lf_blocksize, int flags, - aom_image_t *raw_shift) { - aom_codec_ctx_t codec; - int frame_count = 0; - int image_size_bytes = aom_img_size_bytes(raw); - int u_blocks, v_blocks; - int bu, bv; - aom_fixed_buf_t stats = { NULL, 0 }; - aom_image_t *frame_to_encode; - - if (aom_codec_enc_init(&codec, encoder->codec_interface(), cfg, flags)) - die_codec(&codec, "Failed to initialize encoder"); - if (aom_codec_control(&codec, AOME_SET_ENABLEAUTOALTREF, 0)) - die_codec(&codec, "Failed to turn off auto altref"); - if (aom_codec_control(&codec, AV1E_SET_FRAME_PARALLEL_DECODING, 0)) - die_codec(&codec, "Failed to set frame parallel decoding"); - - // How many reference images we need to encode. - u_blocks = (lf_width + lf_blocksize - 1) / lf_blocksize; - v_blocks = (lf_height + lf_blocksize - 1) / lf_blocksize; - - printf("\n First pass: "); - - for (bv = 0; bv < v_blocks; ++bv) { - for (bu = 0; bu < u_blocks; ++bu) { - const int block_u_min = bu * lf_blocksize; - const int block_v_min = bv * lf_blocksize; - int block_u_end = (bu + 1) * lf_blocksize; - int block_v_end = (bv + 1) * lf_blocksize; - int u_block_size, v_block_size; - int block_ref_u, block_ref_v; - - block_u_end = block_u_end < lf_width ? block_u_end : lf_width; - block_v_end = block_v_end < lf_height ? block_v_end : lf_height; - u_block_size = block_u_end - block_u_min; - v_block_size = block_v_end - block_v_min; - block_ref_u = block_u_min + u_block_size / 2; - block_ref_v = block_v_min + v_block_size / 2; - - printf("A%d, ", (block_ref_u + block_ref_v * lf_width)); - fseek(infile, (block_ref_u + block_ref_v * lf_width) * image_size_bytes, - SEEK_SET); - aom_img_read(raw, infile); - get_raw_image(&frame_to_encode, raw, raw_shift); - - // Reference frames can be encoded encoded without tiles. - ++frame_count; - get_frame_stats(&codec, frame_to_encode, frame_count, 1, - AOM_EFLAG_NO_REF_LAST2 | AOM_EFLAG_NO_REF_LAST3 | - AOM_EFLAG_NO_REF_GF | AOM_EFLAG_NO_REF_ARF | - AOM_EFLAG_NO_REF_BWD | AOM_EFLAG_NO_REF_ARF2 | - AOM_EFLAG_NO_UPD_LAST | AOM_EFLAG_NO_UPD_GF | - AOM_EFLAG_NO_UPD_ARF, - &stats); - } - } - - if (aom_codec_control(&codec, AV1E_SET_FRAME_PARALLEL_DECODING, 1)) - die_codec(&codec, "Failed to set frame parallel decoding"); - - for (bv = 0; bv < v_blocks; ++bv) { - for (bu = 0; bu < u_blocks; ++bu) { - const int block_u_min = bu * lf_blocksize; - const int block_v_min = bv * lf_blocksize; - int block_u_end = (bu + 1) * lf_blocksize; - int block_v_end = (bv + 1) * lf_blocksize; - int u, v; - block_u_end = block_u_end < lf_width ? block_u_end : lf_width; - block_v_end = block_v_end < lf_height ? block_v_end : lf_height; - for (v = block_v_min; v < block_v_end; ++v) { - for (u = block_u_min; u < block_u_end; ++u) { - printf("C%d, ", (u + v * lf_width)); - fseek(infile, (u + v * lf_width) * image_size_bytes, SEEK_SET); - aom_img_read(raw, infile); - get_raw_image(&frame_to_encode, raw, raw_shift); - - ++frame_count; - get_frame_stats(&codec, frame_to_encode, frame_count, 1, - AOM_EFLAG_NO_REF_LAST2 | AOM_EFLAG_NO_REF_LAST3 | - AOM_EFLAG_NO_REF_GF | AOM_EFLAG_NO_REF_ARF | - AOM_EFLAG_NO_REF_BWD | AOM_EFLAG_NO_REF_ARF2 | - AOM_EFLAG_NO_UPD_LAST | AOM_EFLAG_NO_UPD_GF | - AOM_EFLAG_NO_UPD_ARF | AOM_EFLAG_NO_UPD_ENTROPY, - &stats); - } - } - } - } - // Flush encoder. - // No ARF, this should not be needed. - while (get_frame_stats(&codec, NULL, frame_count, 1, 0, &stats)) { - } - - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec."); - - printf("\nFirst pass complete. Processed %d frames.\n", frame_count); - - return stats; -} - -static void pass1(aom_image_t *raw, FILE *infile, const char *outfile_name, - const AvxInterface *encoder, aom_codec_enc_cfg_t *cfg, - int lf_width, int lf_height, int lf_blocksize, int flags, - aom_image_t *raw_shift) { - AvxVideoInfo info = { encoder->fourcc, - cfg->g_w, - cfg->g_h, - { cfg->g_timebase.num, cfg->g_timebase.den }, - 0 }; - AvxVideoWriter *writer = NULL; - aom_codec_ctx_t codec; - int frame_count = 0; - int image_size_bytes = aom_img_size_bytes(raw); - int bu, bv; - int u_blocks, v_blocks; - aom_image_t *frame_to_encode; - aom_image_t reference_images[MAX_EXTERNAL_REFERENCES]; - int reference_image_num = 0; - int i; - - writer = aom_video_writer_open(outfile_name, kContainerIVF, &info); - if (!writer) die("Failed to open %s for writing", outfile_name); - - if (aom_codec_enc_init(&codec, encoder->codec_interface(), cfg, flags)) - die_codec(&codec, "Failed to initialize encoder"); - if (aom_codec_control(&codec, AOME_SET_ENABLEAUTOALTREF, 0)) - die_codec(&codec, "Failed to turn off auto altref"); - if (aom_codec_control(&codec, AV1E_SET_FRAME_PARALLEL_DECODING, 0)) - die_codec(&codec, "Failed to set frame parallel decoding"); - // Note: The superblock is a sequence parameter and has to be the same for 1 - // sequence. In lightfield application, must choose the superblock size(either - // 64x64 or 128x128) before the encoding starts. Otherwise, the default is - // AOM_SUPERBLOCK_SIZE_DYNAMIC, and the superblock size will be set to 64x64 - // internally. - if (aom_codec_control(&codec, AV1E_SET_SUPERBLOCK_SIZE, - AOM_SUPERBLOCK_SIZE_64X64)) - die_codec(&codec, "Failed to set SB size"); - - u_blocks = (lf_width + lf_blocksize - 1) / lf_blocksize; - v_blocks = (lf_height + lf_blocksize - 1) / lf_blocksize; - - reference_image_num = u_blocks * v_blocks; - aom_img_fmt_t ref_fmt = AOM_IMG_FMT_I420; - if (!CONFIG_LOWBITDEPTH) ref_fmt |= AOM_IMG_FMT_HIGHBITDEPTH; - // Allocate memory with the border so that it can be used as a reference. - for (i = 0; i < reference_image_num; i++) { - if (!aom_img_alloc_with_border(&reference_images[i], ref_fmt, cfg->g_w, - cfg->g_h, 32, 8, AOM_BORDER_IN_PIXELS)) { - die("Failed to allocate image."); - } - } - - printf("\n Second pass: "); - - // Encode reference images first. - printf("Encoding Reference Images\n"); - for (bv = 0; bv < v_blocks; ++bv) { - for (bu = 0; bu < u_blocks; ++bu) { - const int block_u_min = bu * lf_blocksize; - const int block_v_min = bv * lf_blocksize; - int block_u_end = (bu + 1) * lf_blocksize; - int block_v_end = (bv + 1) * lf_blocksize; - int u_block_size, v_block_size; - int block_ref_u, block_ref_v; - - block_u_end = block_u_end < lf_width ? block_u_end : lf_width; - block_v_end = block_v_end < lf_height ? block_v_end : lf_height; - u_block_size = block_u_end - block_u_min; - v_block_size = block_v_end - block_v_min; - block_ref_u = block_u_min + u_block_size / 2; - block_ref_v = block_v_min + v_block_size / 2; - - printf("A%d, ", (block_ref_u + block_ref_v * lf_width)); - fseek(infile, (block_ref_u + block_ref_v * lf_width) * image_size_bytes, - SEEK_SET); - aom_img_read(raw, infile); - - get_raw_image(&frame_to_encode, raw, raw_shift); - - // Reference frames may be encoded without tiles. - ++frame_count; - printf("Encoding reference image %d of %d\n", bv * u_blocks + bu, - u_blocks * v_blocks); - encode_frame(&codec, frame_to_encode, frame_count, 1, - AOM_EFLAG_NO_REF_LAST2 | AOM_EFLAG_NO_REF_LAST3 | - AOM_EFLAG_NO_REF_GF | AOM_EFLAG_NO_REF_ARF | - AOM_EFLAG_NO_REF_BWD | AOM_EFLAG_NO_REF_ARF2 | - AOM_EFLAG_NO_UPD_LAST | AOM_EFLAG_NO_UPD_GF | - AOM_EFLAG_NO_UPD_ARF | AOM_EFLAG_NO_UPD_ENTROPY, - writer); - - if (aom_codec_control(&codec, AV1_COPY_NEW_FRAME_IMAGE, - &reference_images[frame_count - 1])) - die_codec(&codec, "Failed to copy decoder reference frame"); - } - } - - cfg->large_scale_tile = 1; - // Fixed q encoding for camera frames. - cfg->rc_end_usage = AOM_Q; - if (aom_codec_enc_config_set(&codec, cfg)) - die_codec(&codec, "Failed to configure encoder"); - - // The fixed q value used in encoding. - if (aom_codec_control(&codec, AOME_SET_CQ_LEVEL, 36)) - die_codec(&codec, "Failed to set cq level"); - if (aom_codec_control(&codec, AV1E_SET_FRAME_PARALLEL_DECODING, 1)) - die_codec(&codec, "Failed to set frame parallel decoding"); - if (aom_codec_control(&codec, AV1E_SET_SINGLE_TILE_DECODING, 1)) - die_codec(&codec, "Failed to turn on single tile decoding"); - // Set tile_columns and tile_rows to MAX values, which guarantees the tile - // size of 64 x 64 pixels(i.e. 1 SB) for <= 4k resolution. - if (aom_codec_control(&codec, AV1E_SET_TILE_COLUMNS, 6)) - die_codec(&codec, "Failed to set tile width"); - if (aom_codec_control(&codec, AV1E_SET_TILE_ROWS, 6)) - die_codec(&codec, "Failed to set tile height"); - - for (bv = 0; bv < v_blocks; ++bv) { - for (bu = 0; bu < u_blocks; ++bu) { - const int block_u_min = bu * lf_blocksize; - const int block_v_min = bv * lf_blocksize; - int block_u_end = (bu + 1) * lf_blocksize; - int block_v_end = (bv + 1) * lf_blocksize; - int u, v; - block_u_end = block_u_end < lf_width ? block_u_end : lf_width; - block_v_end = block_v_end < lf_height ? block_v_end : lf_height; - for (v = block_v_min; v < block_v_end; ++v) { - for (u = block_u_min; u < block_u_end; ++u) { - av1_ref_frame_t ref; - ref.idx = 0; - ref.use_external_ref = 1; - ref.img = reference_images[bv * u_blocks + bu]; - if (aom_codec_control(&codec, AV1_SET_REFERENCE, &ref)) - die_codec(&codec, "Failed to set reference frame"); - - printf("C%d, ", (u + v * lf_width)); - fseek(infile, (u + v * lf_width) * image_size_bytes, SEEK_SET); - aom_img_read(raw, infile); - get_raw_image(&frame_to_encode, raw, raw_shift); - - ++frame_count; - printf("Encoding image %d of %d\n", - frame_count - (u_blocks * v_blocks), lf_width * lf_height); - encode_frame(&codec, frame_to_encode, frame_count, 1, - AOM_EFLAG_NO_REF_LAST2 | AOM_EFLAG_NO_REF_LAST3 | - AOM_EFLAG_NO_REF_GF | AOM_EFLAG_NO_REF_ARF | - AOM_EFLAG_NO_REF_BWD | AOM_EFLAG_NO_REF_ARF2 | - AOM_EFLAG_NO_UPD_LAST | AOM_EFLAG_NO_UPD_GF | - AOM_EFLAG_NO_UPD_ARF | AOM_EFLAG_NO_UPD_ENTROPY, - writer); - } - } - } - } - - // Flush encoder. - // No ARF, this should not be needed. - while (encode_frame(&codec, NULL, -1, 1, 0, writer)) { - } - - for (i = 0; i < reference_image_num; i++) aom_img_free(&reference_images[i]); - - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec."); - aom_video_writer_close(writer); - - printf("\nSecond pass complete. Processed %d frames.\n", frame_count); -} - -int main(int argc, char **argv) { - FILE *infile = NULL; - int w, h; - // The number of lightfield images in the u and v dimensions. - int lf_width, lf_height; - // Defines how many images refer to the same reference image for MCP. - // lf_blocksize X lf_blocksize images will all use the reference image - // in the middle of the block of images. - int lf_blocksize; - aom_codec_ctx_t codec; - aom_codec_enc_cfg_t cfg; - aom_image_t raw; - aom_image_t raw_shift; - aom_codec_err_t res; - aom_fixed_buf_t stats; - int flags = 0; - - const AvxInterface *encoder = NULL; - const int fps = 30; - const int bitrate = 200; // kbit/s - const char *const width_arg = argv[1]; - const char *const height_arg = argv[2]; - const char *const infile_arg = argv[3]; - const char *const outfile_arg = argv[4]; - const char *const lf_width_arg = argv[5]; - const char *const lf_height_arg = argv[6]; - const char *lf_blocksize_arg = argv[7]; - exec_name = argv[0]; - - if (argc < 8) die("Invalid number of arguments"); - - encoder = get_aom_encoder_by_name("av1"); - if (!encoder) die("Unsupported codec."); - - w = (int)strtol(width_arg, NULL, 0); - h = (int)strtol(height_arg, NULL, 0); - lf_width = (int)strtol(lf_width_arg, NULL, 0); - lf_height = (int)strtol(lf_height_arg, NULL, 0); - lf_blocksize = (int)strtol(lf_blocksize_arg, NULL, 0); - lf_blocksize = lf_blocksize < lf_width ? lf_blocksize : lf_width; - lf_blocksize = lf_blocksize < lf_height ? lf_blocksize : lf_height; - - if (w <= 0 || h <= 0 || (w % 2) != 0 || (h % 2) != 0) - die("Invalid frame size: %dx%d", w, h); - if (lf_width <= 0 || lf_height <= 0) - die("Invalid lf_width and/or lf_height: %dx%d", lf_width, lf_height); - if (lf_blocksize <= 0) die("Invalid lf_blocksize: %d", lf_blocksize); - - if (!aom_img_alloc(&raw, AOM_IMG_FMT_I420, w, h, 32)) { - die("Failed to allocate image."); - } - if (!CONFIG_LOWBITDEPTH) { - // Need to allocate larger buffer to use hbd internal. - aom_img_alloc(&raw_shift, AOM_IMG_FMT_I420 | AOM_IMG_FMT_HIGHBITDEPTH, w, h, - 32); - } - - printf("Using %s\n", aom_codec_iface_name(encoder->codec_interface())); - - // Configuration - res = aom_codec_enc_config_default(encoder->codec_interface(), &cfg, 0); - if (res) die_codec(&codec, "Failed to get default codec config."); - - cfg.g_w = w; - cfg.g_h = h; - cfg.g_timebase.num = 1; - cfg.g_timebase.den = fps; - cfg.rc_target_bitrate = bitrate; - cfg.g_error_resilient = 0; // This is required. - cfg.g_lag_in_frames = 0; // need to set this since default is 19. - cfg.kf_mode = AOM_KF_DISABLED; - cfg.large_scale_tile = 0; // Only set it to 1 for camera frame encoding. - cfg.g_bit_depth = AOM_BITS_8; - flags |= (cfg.g_bit_depth > AOM_BITS_8 || !CONFIG_LOWBITDEPTH) - ? AOM_CODEC_USE_HIGHBITDEPTH - : 0; - - if (!(infile = fopen(infile_arg, "rb"))) - die("Failed to open %s for reading", infile_arg); - - // Pass 0 - cfg.g_pass = AOM_RC_FIRST_PASS; - stats = pass0(&raw, infile, encoder, &cfg, lf_width, lf_height, lf_blocksize, - flags, &raw_shift); - - // Pass 1 - rewind(infile); - cfg.g_pass = AOM_RC_LAST_PASS; - cfg.rc_twopass_stats_in = stats; - pass1(&raw, infile, outfile_arg, encoder, &cfg, lf_width, lf_height, - lf_blocksize, flags, &raw_shift); - free(stats.buf); - - if (!CONFIG_LOWBITDEPTH) aom_img_free(&raw_shift); - aom_img_free(&raw); - fclose(infile); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/lightfield_tile_list_decoder.c b/third_party/aom/examples/lightfield_tile_list_decoder.c deleted file mode 100644 index 5556bf0e7..000000000 --- a/third_party/aom/examples/lightfield_tile_list_decoder.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Lightfield Tile List Decoder -// ============================ -// -// This is a lightfield tile list decoder example. It takes an input file that -// contains the anchor frames that are references of the coded tiles, the camera -// frame header, and tile list OBUs that include the tile information and the -// compressed tile data. This input file is reconstructed from the encoded -// lightfield ivf file, and is decodable by AV1 decoder. num_references is -// the number of anchor frames coded at the beginning of the light field file. -// num_tile_lists is the number of tile lists need to be decoded. -// Run lightfield tile list decoder to decode an AV1 tile list file: -// examples/lightfield_tile_list_decoder vase_tile_list.ivf vase_tile_list.yuv -// 4 2 - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -#include "aom/aom_decoder.h" -#include "aom/aomdx.h" -#include "aom_scale/yv12config.h" -#include "av1/common/enums.h" -#include "common/tools_common.h" -#include "common/video_reader.h" - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, - "Usage: %s <infile> <outfile> <num_references> <num_tile_lists>\n", - exec_name); - exit(EXIT_FAILURE); -} - -int main(int argc, char **argv) { - FILE *outfile = NULL; - aom_codec_ctx_t codec; - AvxVideoReader *reader = NULL; - const AvxInterface *decoder = NULL; - const AvxVideoInfo *info = NULL; - int num_references; - int num_tile_lists; - aom_image_t reference_images[MAX_EXTERNAL_REFERENCES]; - size_t frame_size = 0; - const unsigned char *frame = NULL; - int i, j, n; - - exec_name = argv[0]; - - if (argc != 5) die("Invalid number of arguments."); - - reader = aom_video_reader_open(argv[1]); - if (!reader) die("Failed to open %s for reading.", argv[1]); - - if (!(outfile = fopen(argv[2], "wb"))) - die("Failed to open %s for writing.", argv[2]); - - num_references = (int)strtol(argv[3], NULL, 0); - num_tile_lists = (int)strtol(argv[4], NULL, 0); - - info = aom_video_reader_get_info(reader); - - decoder = get_aom_decoder_by_fourcc(info->codec_fourcc); - if (!decoder) die("Unknown input codec."); - printf("Using %s\n", aom_codec_iface_name(decoder->codec_interface())); - - if (aom_codec_dec_init(&codec, decoder->codec_interface(), NULL, 0)) - die_codec(&codec, "Failed to initialize decoder."); - - if (aom_codec_control(&codec, AV1D_SET_IS_ANNEXB, info->is_annexb)) { - die("Failed to set annex b status"); - } - - // Decode anchor frames. - aom_codec_control_(&codec, AV1_SET_TILE_MODE, 0); - for (i = 0; i < num_references; ++i) { - aom_video_reader_read_frame(reader); - frame = aom_video_reader_get_frame(reader, &frame_size); - if (aom_codec_decode(&codec, frame, frame_size, NULL)) - die_codec(&codec, "Failed to decode frame."); - - if (i == 0) { - aom_img_fmt_t ref_fmt = 0; - if (aom_codec_control(&codec, AV1D_GET_IMG_FORMAT, &ref_fmt)) - die_codec(&codec, "Failed to get the image format"); - - int frame_res[2]; - if (aom_codec_control(&codec, AV1D_GET_FRAME_SIZE, frame_res)) - die_codec(&codec, "Failed to get the image frame size"); - - // Allocate memory to store decoded references. Allocate memory with the - // border so that it can be used as a reference. - for (j = 0; j < num_references; j++) { - unsigned int border = AOM_BORDER_IN_PIXELS; - if (!aom_img_alloc_with_border(&reference_images[j], ref_fmt, - frame_res[0], frame_res[1], 32, 8, - border)) { - die("Failed to allocate references."); - } - } - } - - if (aom_codec_control(&codec, AV1_COPY_NEW_FRAME_IMAGE, - &reference_images[i])) - die_codec(&codec, "Failed to copy decoded reference frame"); - - aom_codec_iter_t iter = NULL; - aom_image_t *img = NULL; - while ((img = aom_codec_get_frame(&codec, &iter)) != NULL) { - char name[1024]; - snprintf(name, sizeof(name), "ref_%d.yuv", i); - printf("writing ref image to %s, %d, %d\n", name, img->d_w, img->d_h); - FILE *ref_file = fopen(name, "wb"); - aom_img_write(img, ref_file); - fclose(ref_file); - } - } - - // Decode the lightfield. - aom_codec_control_(&codec, AV1_SET_TILE_MODE, 1); - - // Set external references. - av1_ext_ref_frame_t set_ext_ref = { &reference_images[0], num_references }; - aom_codec_control_(&codec, AV1D_SET_EXT_REF_PTR, &set_ext_ref); - // Must decode the camera frame header first. - aom_video_reader_read_frame(reader); - frame = aom_video_reader_get_frame(reader, &frame_size); - if (aom_codec_decode(&codec, frame, frame_size, NULL)) - die_codec(&codec, "Failed to decode the frame."); - // Decode tile lists one by one. - for (n = 0; n < num_tile_lists; n++) { - aom_video_reader_read_frame(reader); - frame = aom_video_reader_get_frame(reader, &frame_size); - - if (aom_codec_decode(&codec, frame, frame_size, NULL)) - die_codec(&codec, "Failed to decode the tile list."); - aom_codec_iter_t iter = NULL; - aom_image_t *img; - while ((img = aom_codec_get_frame(&codec, &iter))) - fwrite(img->img_data, 1, img->sz, outfile); - } - - for (i = 0; i < num_references; i++) aom_img_free(&reference_images[i]); - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec"); - aom_video_reader_close(reader); - fclose(outfile); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/lossless_encoder.c b/third_party/aom/examples/lossless_encoder.c deleted file mode 100644 index 438ff21c6..000000000 --- a/third_party/aom/examples/lossless_encoder.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_encoder.h" -#include "aom/aomcx.h" -#include "common/tools_common.h" -#include "common/video_writer.h" - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, - "lossless_encoder: Example demonstrating lossless " - "encoding feature. Supports raw input only.\n"); - fprintf(stderr, "Usage: %s <width> <height> <infile> <outfile>\n", exec_name); - exit(EXIT_FAILURE); -} - -static int encode_frame(aom_codec_ctx_t *codec, aom_image_t *img, - int frame_index, int flags, AvxVideoWriter *writer) { - int got_pkts = 0; - aom_codec_iter_t iter = NULL; - const aom_codec_cx_pkt_t *pkt = NULL; - const aom_codec_err_t res = - aom_codec_encode(codec, img, frame_index, 1, flags); - if (res != AOM_CODEC_OK) die_codec(codec, "Failed to encode frame"); - - while ((pkt = aom_codec_get_cx_data(codec, &iter)) != NULL) { - got_pkts = 1; - - if (pkt->kind == AOM_CODEC_CX_FRAME_PKT) { - const int keyframe = (pkt->data.frame.flags & AOM_FRAME_IS_KEY) != 0; - if (!aom_video_writer_write_frame(writer, pkt->data.frame.buf, - pkt->data.frame.sz, - pkt->data.frame.pts)) { - die_codec(codec, "Failed to write compressed frame"); - } - printf(keyframe ? "K" : "."); - fflush(stdout); - } - } - - return got_pkts; -} - -int main(int argc, char **argv) { - FILE *infile = NULL; - aom_codec_ctx_t codec; - aom_codec_enc_cfg_t cfg; - int frame_count = 0; - aom_image_t raw; - aom_codec_err_t res; - AvxVideoInfo info; - AvxVideoWriter *writer = NULL; - const AvxInterface *encoder = NULL; - const int fps = 30; - - exec_name = argv[0]; - - // Clear explicitly, as simply assigning "{ 0 }" generates - // "missing-field-initializers" warning in some compilers. - memset(&info, 0, sizeof(info)); - - if (argc < 5) die("Invalid number of arguments"); - - encoder = get_aom_encoder_by_name("av1"); - if (!encoder) die("Unsupported codec."); - - info.codec_fourcc = encoder->fourcc; - info.frame_width = (int)strtol(argv[1], NULL, 0); - info.frame_height = (int)strtol(argv[2], NULL, 0); - info.time_base.numerator = 1; - info.time_base.denominator = fps; - - if (info.frame_width <= 0 || info.frame_height <= 0 || - (info.frame_width % 2) != 0 || (info.frame_height % 2) != 0) { - die("Invalid frame size: %dx%d", info.frame_width, info.frame_height); - } - - if (!aom_img_alloc(&raw, AOM_IMG_FMT_I420, info.frame_width, - info.frame_height, 1)) { - die("Failed to allocate image."); - } - - printf("Using %s\n", aom_codec_iface_name(encoder->codec_interface())); - - res = aom_codec_enc_config_default(encoder->codec_interface(), &cfg, 0); - if (res) die_codec(&codec, "Failed to get default codec config."); - - cfg.g_w = info.frame_width; - cfg.g_h = info.frame_height; - cfg.g_timebase.num = info.time_base.numerator; - cfg.g_timebase.den = info.time_base.denominator; - - writer = aom_video_writer_open(argv[4], kContainerIVF, &info); - if (!writer) die("Failed to open %s for writing.", argv[4]); - - if (!(infile = fopen(argv[3], "rb"))) - die("Failed to open %s for reading.", argv[3]); - - if (aom_codec_enc_init(&codec, encoder->codec_interface(), &cfg, 0)) - die_codec(&codec, "Failed to initialize encoder"); - - if (aom_codec_control_(&codec, AV1E_SET_LOSSLESS, 1)) - die_codec(&codec, "Failed to use lossless mode"); - - // Encode frames. - while (aom_img_read(&raw, infile)) { - encode_frame(&codec, &raw, frame_count++, 0, writer); - } - - // Flush encoder. - while (encode_frame(&codec, NULL, -1, 0, writer)) { - } - - printf("\n"); - fclose(infile); - printf("Processed %d frames.\n", frame_count); - - aom_img_free(&raw); - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec."); - - aom_video_writer_close(writer); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/noise_model.c b/third_party/aom/examples/noise_model.c deleted file mode 100644 index 5cc6003b6..000000000 --- a/third_party/aom/examples/noise_model.c +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -/*!\file - * \brief This is an sample binary to create noise params from input video. - * - * To allow for external denoising applications, this sample binary illustrates - * how to create a film grain table (film grain params as a function of time) - * from an input video and its corresponding denoised source. - * - * The --output-grain-table file can be passed as input to the encoder (in - * aomenc this is done through the "--film-grain-table" parameter). - * - * As an example, where the input source is an 854x480 yuv420p 8-bit video - * named "input.854_480.yuv" you would use steps similar to the following: - * - * # Run your denoiser (e.g, using hqdn3d filter): - * ffmpeg -vcodec rawvideo -video_size 854x480 -i input.854_480.yuv \ - * -vf hqdn3d=5:5:5:5 -vcodec rawvideo -an -f rawvideo \ - * denoised.854_480.yuv - * - * # Model the noise between the denoised version and original source: - * ./examples/noise_model --fps=25/1 --width=854 --height=480 --i420 \ - * --input-denoised=denoised.854_480.yuv --input=original.854_480.yuv \ - * --output-grain-table=film_grain.tbl - * - * # Encode with your favorite settings (including the grain table): - * aomenc --limit=100 --cpu-used=4 --input-bit-depth=8 \ - * --i420 -w 854 -h 480 --end-usage=q --cq-level=25 --lag-in-frames=25 \ - * --auto-alt-ref=2 --bit-depth=8 --film-grain-table=film_grain.tbl \ - * -o denoised_with_grain_params.ivf denoised.854_480.yuv - */ -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_encoder.h" -#include "aom_dsp/aom_dsp_common.h" - -#if CONFIG_AV1_DECODER -#include "aom_dsp/grain_synthesis.h" -#endif - -#include "aom_dsp/grain_table.h" -#include "aom_dsp/noise_model.h" -#include "aom_dsp/noise_util.h" -#include "aom_mem/aom_mem.h" -#include "common/args.h" -#include "common/tools_common.h" -#include "common/video_writer.h" - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, - "Usage: %s --input=<input> --input-denoised=<denoised> " - "--output-grain-table=<outfile> " - "See comments in noise_model.c for more information.\n", - exec_name); - exit(EXIT_FAILURE); -} - -static const arg_def_t help = - ARG_DEF(NULL, "help", 0, "Show usage options and exit"); -static const arg_def_t width_arg = - ARG_DEF("w", "width", 1, "Input width (if rawvideo)"); -static const arg_def_t height_arg = - ARG_DEF("h", "height", 1, "Input height (if rawvideo)"); -static const arg_def_t skip_frames_arg = - ARG_DEF("s", "skip-frames", 1, "Number of frames to skip (default = 1)"); -static const arg_def_t fps_arg = ARG_DEF(NULL, "fps", 1, "Frame rate"); -static const arg_def_t input_arg = ARG_DEF("-i", "input", 1, "Input filename"); -static const arg_def_t output_grain_table_arg = - ARG_DEF("n", "output-grain-table", 1, "Output noise file"); -static const arg_def_t input_denoised_arg = - ARG_DEF("d", "input-denoised", 1, "Input denoised filename (YUV) only"); -static const arg_def_t flat_block_finder_arg = - ARG_DEF("b", "flat-block-finder", 1, "Run the flat block finder"); -static const arg_def_t block_size_arg = - ARG_DEF("b", "block-size", 1, "Block size"); -static const arg_def_t bit_depth_arg = - ARG_DEF(NULL, "bit-depth", 1, "Bit depth of input"); -static const arg_def_t use_i420 = - ARG_DEF(NULL, "i420", 0, "Input file (and denoised) is I420 (default)"); -static const arg_def_t use_i422 = - ARG_DEF(NULL, "i422", 0, "Input file (and denoised) is I422"); -static const arg_def_t use_i444 = - ARG_DEF(NULL, "i444", 0, "Input file (and denoised) is I444"); -static const arg_def_t debug_file_arg = - ARG_DEF(NULL, "debug-file", 1, "File to output debug info"); - -typedef struct { - int width; - int height; - struct aom_rational fps; - const char *input; - const char *input_denoised; - const char *output_grain_table; - int img_fmt; - int block_size; - int bit_depth; - int run_flat_block_finder; - int force_flat_psd; - int skip_frames; - const char *debug_file; -} noise_model_args_t; - -void parse_args(noise_model_args_t *noise_args, int *argc, char **argv) { - struct arg arg; - static const arg_def_t *main_args[] = { &help, - &input_arg, - &fps_arg, - &width_arg, - &height_arg, - &block_size_arg, - &output_grain_table_arg, - &input_denoised_arg, - &use_i420, - &use_i422, - &use_i444, - &debug_file_arg, - NULL }; - for (int argi = *argc + 1; *argv; argi++, argv++) { - if (arg_match(&arg, &help, argv)) { - fprintf(stdout, "\nOptions:\n"); - arg_show_usage(stdout, main_args); - exit(0); - } else if (arg_match(&arg, &width_arg, argv)) { - noise_args->width = atoi(arg.val); - } else if (arg_match(&arg, &height_arg, argv)) { - noise_args->height = atoi(arg.val); - } else if (arg_match(&arg, &input_arg, argv)) { - noise_args->input = arg.val; - } else if (arg_match(&arg, &input_denoised_arg, argv)) { - noise_args->input_denoised = arg.val; - } else if (arg_match(&arg, &output_grain_table_arg, argv)) { - noise_args->output_grain_table = arg.val; - } else if (arg_match(&arg, &block_size_arg, argv)) { - noise_args->block_size = atoi(arg.val); - } else if (arg_match(&arg, &bit_depth_arg, argv)) { - noise_args->bit_depth = atoi(arg.val); - } else if (arg_match(&arg, &flat_block_finder_arg, argv)) { - noise_args->run_flat_block_finder = atoi(arg.val); - } else if (arg_match(&arg, &fps_arg, argv)) { - noise_args->fps = arg_parse_rational(&arg); - } else if (arg_match(&arg, &use_i420, argv)) { - noise_args->img_fmt = AOM_IMG_FMT_I420; - } else if (arg_match(&arg, &use_i422, argv)) { - noise_args->img_fmt = AOM_IMG_FMT_I422; - } else if (arg_match(&arg, &use_i444, argv)) { - noise_args->img_fmt = AOM_IMG_FMT_I444; - } else if (arg_match(&arg, &skip_frames_arg, argv)) { - noise_args->skip_frames = atoi(arg.val); - } else if (arg_match(&arg, &debug_file_arg, argv)) { - noise_args->debug_file = arg.val; - } else { - fprintf(stdout, "Unknown arg: %s\n\nUsage:\n", *argv); - arg_show_usage(stdout, main_args); - exit(0); - } - } - if (noise_args->bit_depth > 8) { - noise_args->img_fmt |= AOM_IMG_FMT_HIGHBITDEPTH; - } -} - -#if CONFIG_AV1_DECODER -static void print_variance_y(FILE *debug_file, aom_image_t *raw, - aom_image_t *denoised, const uint8_t *flat_blocks, - int block_size, aom_film_grain_t *grain) { - aom_image_t renoised; - grain->apply_grain = 1; - grain->random_seed = 7391; - aom_img_alloc(&renoised, raw->fmt, raw->w, raw->h, 1); - - if (av1_add_film_grain(grain, denoised, &renoised)) { - fprintf(stderr, "Internal failure in av1_add_film_grain().\n"); - aom_img_free(&renoised); - return; - } - - const int num_blocks_w = (raw->w + block_size - 1) / block_size; - const int num_blocks_h = (raw->h + block_size - 1) / block_size; - fprintf(debug_file, "x = ["); - for (int by = 0; by < num_blocks_h; by++) { - for (int bx = 0; bx < num_blocks_w; bx++) { - double block_mean = 0; - double noise_std = 0, noise_mean = 0; - double renoise_std = 0, renoise_mean = 0; - for (int yi = 0; yi < block_size; ++yi) { - const int y = by * block_size + yi; - for (int xi = 0; xi < block_size; ++xi) { - const int x = bx * block_size + xi; - const double noise_v = (raw->planes[0][y * raw->stride[0] + x] - - denoised->planes[0][y * raw->stride[0] + x]); - noise_mean += noise_v; - noise_std += noise_v * noise_v; - - block_mean += raw->planes[0][y * raw->stride[0] + x]; - - const double renoise_v = - (renoised.planes[0][y * raw->stride[0] + x] - - denoised->planes[0][y * raw->stride[0] + x]); - renoise_mean += renoise_v; - renoise_std += renoise_v * renoise_v; - } - } - int n = (block_size * block_size); - block_mean /= n; - noise_mean /= n; - renoise_mean /= n; - noise_std = sqrt(noise_std / n - noise_mean * noise_mean); - renoise_std = sqrt(renoise_std / n - renoise_mean * renoise_mean); - fprintf(debug_file, "%d %3.2lf %3.2lf %3.2lf ", - flat_blocks[by * num_blocks_w + bx], block_mean, noise_std, - renoise_std); - } - fprintf(debug_file, "\n"); - } - fprintf(debug_file, "];\n"); - - if (raw->fmt & AOM_IMG_FMT_HIGHBITDEPTH) { - fprintf(stderr, - "Detailed debug info not supported for high bit" - "depth formats\n"); - } else { - fprintf(debug_file, "figure(2); clf;\n"); - fprintf(debug_file, - "scatter(x(:, 2:4:end), x(:, 3:4:end), 'r'); hold on;\n"); - fprintf(debug_file, "scatter(x(:, 2:4:end), x(:, 4:4:end), 'b');\n"); - fprintf(debug_file, - "plot(linspace(0, 255, length(noise_strength_0)), " - "noise_strength_0, 'b');\n"); - fprintf(debug_file, - "title('Scatter plot of intensity vs noise strength');\n"); - fprintf(debug_file, - "legend('Actual', 'Estimated', 'Estimated strength');\n"); - fprintf(debug_file, "figure(3); clf;\n"); - fprintf(debug_file, "scatter(x(:, 3:4:end), x(:, 4:4:end), 'k');\n"); - fprintf(debug_file, "title('Actual vs Estimated');\n"); - fprintf(debug_file, "pause(3);\n"); - } - aom_img_free(&renoised); -} -#endif - -static void print_debug_info(FILE *debug_file, aom_image_t *raw, - aom_image_t *denoised, uint8_t *flat_blocks, - int block_size, aom_noise_model_t *noise_model) { - (void)raw; - (void)denoised; - (void)flat_blocks; - (void)block_size; - fprintf(debug_file, "figure(3); clf;\n"); - fprintf(debug_file, "figure(2); clf;\n"); - fprintf(debug_file, "figure(1); clf;\n"); - for (int c = 0; c < 3; ++c) { - fprintf(debug_file, "noise_strength_%d = [\n", c); - const aom_equation_system_t *eqns = - &noise_model->combined_state[c].strength_solver.eqns; - for (int k = 0; k < eqns->n; ++k) { - fprintf(debug_file, "%lf ", eqns->x[k]); - } - fprintf(debug_file, "];\n"); - fprintf(debug_file, "plot(noise_strength_%d); hold on;\n", c); - } - fprintf(debug_file, "legend('Y', 'cb', 'cr');\n"); - fprintf(debug_file, "title('Noise strength function');\n"); - -#if CONFIG_AV1_DECODER - aom_film_grain_t grain; - aom_noise_model_get_grain_parameters(noise_model, &grain); - print_variance_y(debug_file, raw, denoised, flat_blocks, block_size, &grain); -#endif - fflush(debug_file); -} - -int main(int argc, char *argv[]) { - noise_model_args_t args = { 0, 0, { 25, 1 }, 0, 0, 0, AOM_IMG_FMT_I420, - 32, 8, 1, 0, 1, NULL }; - aom_image_t raw, denoised; - FILE *infile = NULL; - AvxVideoInfo info; - - memset(&info, 0, sizeof(info)); - - exec_name = argv[0]; - parse_args(&args, &argc, argv + 1); - - info.frame_width = args.width; - info.frame_height = args.height; - info.time_base.numerator = args.fps.den; - info.time_base.denominator = args.fps.num; - - if (info.frame_width <= 0 || info.frame_height <= 0 || - (info.frame_width % 2) != 0 || (info.frame_height % 2) != 0) { - die("Invalid frame size: %dx%d", info.frame_width, info.frame_height); - } - if (!aom_img_alloc(&raw, args.img_fmt, info.frame_width, info.frame_height, - 1)) { - die("Failed to allocate image."); - } - if (!aom_img_alloc(&denoised, args.img_fmt, info.frame_width, - info.frame_height, 1)) { - die("Failed to allocate image."); - } - infile = fopen(args.input, "r"); - if (!infile) { - die("Failed to open input file:", args.input); - } - fprintf(stderr, "Bit depth: %d stride:%d\n", args.bit_depth, raw.stride[0]); - - const int high_bd = args.bit_depth > 8; - const int block_size = args.block_size; - aom_flat_block_finder_t block_finder; - aom_flat_block_finder_init(&block_finder, block_size, args.bit_depth, - high_bd); - - const int num_blocks_w = (info.frame_width + block_size - 1) / block_size; - const int num_blocks_h = (info.frame_height + block_size - 1) / block_size; - uint8_t *flat_blocks = (uint8_t *)aom_malloc(num_blocks_w * num_blocks_h); - // Sets the random seed on the first entry in the output table - int16_t random_seed = 7391; - aom_noise_model_t noise_model; - aom_noise_model_params_t params = { AOM_NOISE_SHAPE_SQUARE, 3, args.bit_depth, - high_bd }; - aom_noise_model_init(&noise_model, params); - - FILE *denoised_file = 0; - if (args.input_denoised) { - denoised_file = fopen(args.input_denoised, "rb"); - if (!denoised_file) - die("Unable to open input_denoised: %s", args.input_denoised); - } else { - die("--input-denoised file must be specified"); - } - FILE *debug_file = 0; - if (args.debug_file) { - debug_file = fopen(args.debug_file, "w"); - } - aom_film_grain_table_t grain_table = { 0, 0 }; - - int64_t prev_timestamp = 0; - int frame_count = 0; - while (aom_img_read(&raw, infile)) { - if (args.input_denoised) { - if (!aom_img_read(&denoised, denoised_file)) { - die("Unable to read input denoised file"); - } - } - if (frame_count % args.skip_frames == 0) { - int num_flat_blocks = num_blocks_w * num_blocks_h; - memset(flat_blocks, 1, num_flat_blocks); - if (args.run_flat_block_finder) { - memset(flat_blocks, 0, num_flat_blocks); - num_flat_blocks = aom_flat_block_finder_run( - &block_finder, raw.planes[0], info.frame_width, info.frame_height, - info.frame_width, flat_blocks); - fprintf(stdout, "Num flat blocks %d\n", num_flat_blocks); - } - - const uint8_t *planes[3] = { raw.planes[0], raw.planes[1], - raw.planes[2] }; - uint8_t *denoised_planes[3] = { denoised.planes[0], denoised.planes[1], - denoised.planes[2] }; - int strides[3] = { raw.stride[0] >> high_bd, raw.stride[1] >> high_bd, - raw.stride[2] >> high_bd }; - int chroma_sub[3] = { raw.x_chroma_shift, raw.y_chroma_shift, 0 }; - - fprintf(stdout, "Updating noise model...\n"); - aom_noise_status_t status = aom_noise_model_update( - &noise_model, (const uint8_t *const *)planes, - (const uint8_t *const *)denoised_planes, info.frame_width, - info.frame_height, strides, chroma_sub, flat_blocks, block_size); - - int64_t cur_timestamp = - frame_count * 10000000ULL * args.fps.den / args.fps.num; - if (status == AOM_NOISE_STATUS_DIFFERENT_NOISE_TYPE) { - fprintf(stdout, - "Noise type is different, updating parameters for time " - "[ %" PRId64 ", %" PRId64 ")\n", - prev_timestamp, cur_timestamp); - aom_film_grain_t grain; - aom_noise_model_get_grain_parameters(&noise_model, &grain); - grain.random_seed = random_seed; - random_seed = 0; - aom_film_grain_table_append(&grain_table, prev_timestamp, cur_timestamp, - &grain); - aom_noise_model_save_latest(&noise_model); - prev_timestamp = cur_timestamp; - } - if (debug_file) { - print_debug_info(debug_file, &raw, &denoised, flat_blocks, block_size, - &noise_model); - } - fprintf(stdout, "Done noise model update, status = %d\n", status); - } - frame_count++; - } - - aom_film_grain_t grain; - aom_noise_model_get_grain_parameters(&noise_model, &grain); - grain.random_seed = random_seed; - aom_film_grain_table_append(&grain_table, prev_timestamp, INT64_MAX, &grain); - if (args.output_grain_table) { - struct aom_internal_error_info error_info; - if (AOM_CODEC_OK != aom_film_grain_table_write(&grain_table, - args.output_grain_table, - &error_info)) { - die("Unable to write output film grain table"); - } - } - aom_film_grain_table_free(&grain_table); - - if (infile) fclose(infile); - if (denoised_file) fclose(denoised_file); - if (debug_file) fclose(debug_file); - aom_img_free(&raw); - aom_img_free(&denoised); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/resize_util.c b/third_party/aom/examples/resize_util.c deleted file mode 100644 index 6a84d5740..000000000 --- a/third_party/aom/examples/resize_util.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <assert.h> -#include <limits.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "av1/common/resize.h" -#include "common/tools_common.h" - -static const char *exec_name = NULL; - -static void usage() { - printf("Usage:\n"); - printf("%s <input_yuv> <width>x<height> <target_width>x<target_height> ", - exec_name); - printf("<output_yuv> [<frames>]\n"); -} - -void usage_exit(void) { - usage(); - exit(EXIT_FAILURE); -} - -static int parse_dim(char *v, int *width, int *height) { - char *x = strchr(v, 'x'); - if (x == NULL) x = strchr(v, 'X'); - if (x == NULL) return 0; - *width = atoi(v); - *height = atoi(&x[1]); - if (*width <= 0 || *height <= 0) - return 0; - else - return 1; -} - -int main(int argc, char *argv[]) { - char *fin, *fout; - FILE *fpin, *fpout; - uint8_t *inbuf, *outbuf; - uint8_t *inbuf_u, *outbuf_u; - uint8_t *inbuf_v, *outbuf_v; - int f, frames; - int width, height, target_width, target_height; - - exec_name = argv[0]; - - if (argc < 5) { - printf("Incorrect parameters:\n"); - usage(); - return 1; - } - - fin = argv[1]; - fout = argv[4]; - if (!parse_dim(argv[2], &width, &height)) { - printf("Incorrect parameters: %s\n", argv[2]); - usage(); - return 1; - } - if (!parse_dim(argv[3], &target_width, &target_height)) { - printf("Incorrect parameters: %s\n", argv[3]); - usage(); - return 1; - } - - fpin = fopen(fin, "rb"); - if (fpin == NULL) { - printf("Can't open file %s to read\n", fin); - usage(); - return 1; - } - fpout = fopen(fout, "wb"); - if (fpout == NULL) { - printf("Can't open file %s to write\n", fout); - usage(); - return 1; - } - if (argc >= 6) - frames = atoi(argv[5]); - else - frames = INT_MAX; - - printf("Input size: %dx%d\n", width, height); - printf("Target size: %dx%d, Frames: ", target_width, target_height); - if (frames == INT_MAX) - printf("All\n"); - else - printf("%d\n", frames); - - inbuf = (uint8_t *)malloc(width * height * 3 / 2); - outbuf = (uint8_t *)malloc(target_width * target_height * 3 / 2); - inbuf_u = inbuf + width * height; - inbuf_v = inbuf_u + width * height / 4; - outbuf_u = outbuf + target_width * target_height; - outbuf_v = outbuf_u + target_width * target_height / 4; - f = 0; - while (f < frames) { - if (fread(inbuf, width * height * 3 / 2, 1, fpin) != 1) break; - av1_resize_frame420(inbuf, width, inbuf_u, inbuf_v, width / 2, height, - width, outbuf, target_width, outbuf_u, outbuf_v, - target_width / 2, target_height, target_width); - fwrite(outbuf, target_width * target_height * 3 / 2, 1, fpout); - f++; - } - printf("%d frames processed\n", f); - fclose(fpin); - fclose(fpout); - - free(inbuf); - free(outbuf); - return 0; -} diff --git a/third_party/aom/examples/scalable_decoder.c b/third_party/aom/examples/scalable_decoder.c deleted file mode 100644 index c22924223..000000000 --- a/third_party/aom/examples/scalable_decoder.c +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Scalable Decoder -// ============== -// -// This is an example of a scalable decoder loop. It takes a 2-spatial-layer -// input file -// containing the compressed data (in OBU format), passes it through the -// decoder, and writes the decompressed frames to disk. The base layer and -// enhancement layers are stored as separate files, out_lyr0.yuv and -// out_lyr1.yuv, respectively. -// -// Standard Includes -// ----------------- -// For decoders, you only have to include `aom_decoder.h` and then any -// header files for the specific codecs you use. In this case, we're using -// av1. -// -// Initializing The Codec -// ---------------------- -// The libaom decoder is initialized by the call to aom_codec_dec_init(). -// Determining the codec interface to use is handled by AvxVideoReader and the -// functions prefixed with aom_video_reader_. Discussion of those functions is -// beyond the scope of this example, but the main gist is to open the input file -// and parse just enough of it to determine if it's a AVx file and which AVx -// codec is contained within the file. -// Note the NULL pointer passed to aom_codec_dec_init(). We do that in this -// example because we want the algorithm to determine the stream configuration -// (width/height) and allocate memory automatically. -// -// Decoding A Frame -// ---------------- -// Once the frame has been read into memory, it is decoded using the -// `aom_codec_decode` function. The call takes a pointer to the data -// (`frame`) and the length of the data (`frame_size`). No application data -// is associated with the frame in this example, so the `user_priv` -// parameter is NULL. The `deadline` parameter is left at zero for this -// example. This parameter is generally only used when doing adaptive post -// processing. -// -// Codecs may produce a variable number of output frames for every call to -// `aom_codec_decode`. These frames are retrieved by the -// `aom_codec_get_frame` iterator function. The iterator variable `iter` is -// initialized to NULL each time `aom_codec_decode` is called. -// `aom_codec_get_frame` is called in a loop, returning a pointer to a -// decoded image or NULL to indicate the end of list. -// -// Processing The Decoded Data -// --------------------------- -// In this example, we simply write the encoded data to disk. It is -// important to honor the image's `stride` values. -// -// Cleanup -// ------- -// The `aom_codec_destroy` call frees any memory allocated by the codec. -// -// Error Handling -// -------------- -// This example does not special case any error return codes. If there was -// an error, a descriptive message is printed and the program exits. With -// few exceptions, aom_codec functions return an enumerated error status, -// with the value `0` indicating success. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_decoder.h" -#include "aom/aomdx.h" -#include "common/obudec.h" -#include "common/tools_common.h" -#include "common/video_reader.h" - -static const char *exec_name; - -#define MAX_LAYERS 5 - -void usage_exit(void) { - fprintf(stderr, "Usage: %s <infile>\n", exec_name); - exit(EXIT_FAILURE); -} - -int main(int argc, char **argv) { - int frame_cnt = 0; - FILE *outfile[MAX_LAYERS]; - char filename[80]; - aom_codec_ctx_t codec; - const AvxInterface *decoder = NULL; - FILE *inputfile = NULL; - uint8_t *buf = NULL; - size_t bytes_in_buffer = 0; - size_t buffer_size = 0; - struct AvxInputContext aom_input_ctx; - struct ObuDecInputContext obu_ctx = { &aom_input_ctx, NULL, 0, 0, 0 }; - aom_codec_stream_info_t si; - uint8_t tmpbuf[32]; - unsigned int i; - - exec_name = argv[0]; - - if (argc != 2) die("Invalid number of arguments."); - - if (!(inputfile = fopen(argv[1], "rb"))) - die("Failed to open %s for read.", argv[1]); - obu_ctx.avx_ctx->file = inputfile; - obu_ctx.avx_ctx->filename = argv[1]; - - decoder = get_aom_decoder_by_index(0); - printf("Using %s\n", aom_codec_iface_name(decoder->codec_interface())); - - if (aom_codec_dec_init(&codec, decoder->codec_interface(), NULL, 0)) - die_codec(&codec, "Failed to initialize decoder."); - - if (aom_codec_control(&codec, AV1D_SET_OUTPUT_ALL_LAYERS, 1)) { - die_codec(&codec, "Failed to set output_all_layers control."); - } - - // peak sequence header OBU to get number of spatial layers - const size_t ret = fread(tmpbuf, 1, 32, inputfile); - if (ret != 32) die_codec(&codec, "Input is not a valid obu file"); - si.is_annexb = 0; - if (aom_codec_peek_stream_info(decoder->codec_interface(), tmpbuf, 32, &si)) { - die_codec(&codec, "Input is not a valid obu file"); - } - fseek(inputfile, -32, SEEK_CUR); - - if (!file_is_obu(&obu_ctx)) - die_codec(&codec, "Input is not a valid obu file"); - - // open base layer output yuv file - snprintf(filename, sizeof(filename), "out_lyr%d.yuv", 0); - if (!(outfile[0] = fopen(filename, "wb"))) - die("Failed top open output for writing."); - - // open any enhancement layer output yuv files - for (i = 1; i < si.number_spatial_layers; i++) { - snprintf(filename, sizeof(filename), "out_lyr%d.yuv", i); - if (!(outfile[i] = fopen(filename, "wb"))) - die("Failed to open output for writing."); - } - - while (!obudec_read_temporal_unit(&obu_ctx, &buf, &bytes_in_buffer, - &buffer_size)) { - aom_codec_iter_t iter = NULL; - aom_image_t *img = NULL; - if (aom_codec_decode(&codec, buf, bytes_in_buffer, NULL)) - die_codec(&codec, "Failed to decode frame."); - - while ((img = aom_codec_get_frame(&codec, &iter)) != NULL) { - aom_image_t *img_shifted = - aom_img_alloc(NULL, AOM_IMG_FMT_I420, img->d_w, img->d_h, 16); - img_shifted->bit_depth = 8; - aom_img_downshift(img_shifted, img, - img->bit_depth - img_shifted->bit_depth); - if (img->spatial_id == 0) { - printf("Writing base layer 0 %d\n", frame_cnt); - aom_img_write(img_shifted, outfile[0]); - } else if (img->spatial_id <= (int)(si.number_spatial_layers - 1)) { - printf("Writing enhancement layer %d %d\n", img->spatial_id, frame_cnt); - aom_img_write(img_shifted, outfile[img->spatial_id]); - } else { - die_codec(&codec, "Invalid bitstream. Layer id exceeds layer count"); - } - if (img->spatial_id == (int)(si.number_spatial_layers - 1)) ++frame_cnt; - } - } - - printf("Processed %d frames.\n", frame_cnt); - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec"); - - for (i = 0; i < si.number_spatial_layers; i++) fclose(outfile[i]); - - fclose(inputfile); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/scalable_encoder.c b/third_party/aom/examples/scalable_encoder.c deleted file mode 100644 index 7af03e29f..000000000 --- a/third_party/aom/examples/scalable_encoder.c +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Scalable Encoder -// ============== -// -// This is an example of a scalable encoder loop. It takes two input files in -// YV12 format, passes it through the encoder, and writes the compressed -// frames to disk in OBU format. -// -// Getting The Default Configuration -// --------------------------------- -// Encoders have the notion of "usage profiles." For example, an encoder -// may want to publish default configurations for both a video -// conferencing application and a best quality offline encoder. These -// obviously have very different default settings. Consult the -// documentation for your codec to see if it provides any default -// configurations. All codecs provide a default configuration, number 0, -// which is valid for material in the vacinity of QCIF/QVGA. -// -// Updating The Configuration -// --------------------------------- -// Almost all applications will want to update the default configuration -// with settings specific to their usage. Here we set the width and height -// of the video file to that specified on the command line. We also scale -// the default bitrate based on the ratio between the default resolution -// and the resolution specified on the command line. -// -// Encoding A Frame -// ---------------- -// The frame is read as a continuous block (size = width * height * 3 / 2) -// from the input file. If a frame was read (the input file has not hit -// EOF) then the frame is passed to the encoder. Otherwise, a NULL -// is passed, indicating the End-Of-Stream condition to the encoder. The -// `frame_cnt` is reused as the presentation time stamp (PTS) and each -// frame is shown for one frame-time in duration. The flags parameter is -// unused in this example. - -// Forced Keyframes -// ---------------- -// Keyframes can be forced by setting the AOM_EFLAG_FORCE_KF bit of the -// flags passed to `aom_codec_control()`. In this example, we force a -// keyframe every <keyframe-interval> frames. Note, the output stream can -// contain additional keyframes beyond those that have been forced using the -// AOM_EFLAG_FORCE_KF flag because of automatic keyframe placement by the -// encoder. -// -// Processing The Encoded Data -// --------------------------- -// Each packet of type `AOM_CODEC_CX_FRAME_PKT` contains the encoded data -// for this frame. We write a IVF frame header, followed by the raw data. -// -// Cleanup -// ------- -// The `aom_codec_destroy` call frees any memory allocated by the codec. -// -// Error Handling -// -------------- -// This example does not special case any error return codes. If there was -// an error, a descriptive message is printed and the program exits. With -// few exeptions, aom_codec functions return an enumerated error status, -// with the value `0` indicating success. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_encoder.h" -#include "aom/aomcx.h" -#include "av1/common/enums.h" -#include "common/tools_common.h" -#include "common/video_writer.h" - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, - "Usage: %s <codec> <width> <height> <infile0> <infile1> " - "<outfile> <frames to encode>\n" - "See comments in scalable_encoder.c for more information.\n", - exec_name); - exit(EXIT_FAILURE); -} - -static int encode_frame(aom_codec_ctx_t *codec, aom_image_t *img, - int frame_index, int flags, FILE *outfile) { - int got_pkts = 0; - aom_codec_iter_t iter = NULL; - const aom_codec_cx_pkt_t *pkt = NULL; - const aom_codec_err_t res = - aom_codec_encode(codec, img, frame_index, 1, flags); - if (res != AOM_CODEC_OK) die_codec(codec, "Failed to encode frame"); - - while ((pkt = aom_codec_get_cx_data(codec, &iter)) != NULL) { - got_pkts = 1; - - if (pkt->kind == AOM_CODEC_CX_FRAME_PKT) { - const int keyframe = (pkt->data.frame.flags & AOM_FRAME_IS_KEY) != 0; - if (fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile) != - pkt->data.frame.sz) { - die_codec(codec, "Failed to write compressed frame"); - } - printf(keyframe ? "K" : "."); - printf(" %6d\n", (int)pkt->data.frame.sz); - fflush(stdout); - } - } - - return got_pkts; -} - -int main(int argc, char **argv) { - FILE *infile0 = NULL; - FILE *infile1 = NULL; - aom_codec_ctx_t codec; - aom_codec_enc_cfg_t cfg; - int frame_count = 0; - aom_image_t raw0, raw1; - aom_codec_err_t res; - AvxVideoInfo info; - const AvxInterface *encoder = NULL; - const int fps = 30; - const int bitrate = 200; - int keyframe_interval = 0; - int max_frames = 0; - int frames_encoded = 0; - const char *codec_arg = NULL; - const char *width_arg = NULL; - const char *height_arg = NULL; - const char *infile0_arg = NULL; - const char *infile1_arg = NULL; - const char *outfile_arg = NULL; - // const char *keyframe_interval_arg = NULL; - FILE *outfile = NULL; - - exec_name = argv[0]; - - // Clear explicitly, as simply assigning "{ 0 }" generates - // "missing-field-initializers" warning in some compilers. - memset(&info, 0, sizeof(info)); - - if (argc != 8) die("Invalid number of arguments"); - - codec_arg = argv[1]; - width_arg = argv[2]; - height_arg = argv[3]; - infile0_arg = argv[4]; - infile1_arg = argv[5]; - outfile_arg = argv[6]; - max_frames = (int)strtol(argv[7], NULL, 0); - - encoder = get_aom_encoder_by_name(codec_arg); - if (!encoder) die("Unsupported codec."); - - info.codec_fourcc = encoder->fourcc; - info.frame_width = (int)strtol(width_arg, NULL, 0); - info.frame_height = (int)strtol(height_arg, NULL, 0); - info.time_base.numerator = 1; - info.time_base.denominator = fps; - - if (info.frame_width <= 0 || info.frame_height <= 0 || - (info.frame_width % 2) != 0 || (info.frame_height % 2) != 0) { - die("Invalid frame size: %dx%d", info.frame_width, info.frame_height); - } - - if (!aom_img_alloc(&raw0, AOM_IMG_FMT_I420, info.frame_width, - info.frame_height, 1)) { - die("Failed to allocate image for layer 0."); - } - if (!aom_img_alloc(&raw1, AOM_IMG_FMT_I420, info.frame_width, - info.frame_height, 1)) { - die("Failed to allocate image for layer 1."); - } - - // keyframe_interval = (int)strtol(keyframe_interval_arg, NULL, 0); - keyframe_interval = 100; - if (keyframe_interval < 0) die("Invalid keyframe interval value."); - - printf("Using %s\n", aom_codec_iface_name(encoder->codec_interface())); - - res = aom_codec_enc_config_default(encoder->codec_interface(), &cfg, 0); - if (res) die_codec(&codec, "Failed to get default codec config."); - - cfg.g_w = info.frame_width; - cfg.g_h = info.frame_height; - cfg.g_timebase.num = info.time_base.numerator; - cfg.g_timebase.den = info.time_base.denominator; - cfg.rc_target_bitrate = bitrate; - cfg.g_error_resilient = 0; - cfg.g_lag_in_frames = 0; - cfg.rc_end_usage = AOM_Q; - cfg.save_as_annexb = 0; - - outfile = fopen(outfile_arg, "wb"); - if (!outfile) die("Failed to open %s for writing.", outfile_arg); - - if (!(infile0 = fopen(infile0_arg, "rb"))) - die("Failed to open %s for reading.", infile0_arg); - if (!(infile1 = fopen(infile1_arg, "rb"))) - die("Failed to open %s for reading.", infile0_arg); - - if (aom_codec_enc_init(&codec, encoder->codec_interface(), &cfg, 0)) - die_codec(&codec, "Failed to initialize encoder"); - if (aom_codec_control(&codec, AOME_SET_CPUUSED, 8)) - die_codec(&codec, "Failed to set cpu to 8"); - - if (aom_codec_control(&codec, AV1E_SET_TILE_COLUMNS, 2)) - die_codec(&codec, "Failed to set tile columns to 2"); - if (aom_codec_control(&codec, AV1E_SET_NUM_TG, 3)) - die_codec(&codec, "Failed to set num of tile groups to 3"); - - if (aom_codec_control(&codec, AOME_SET_NUMBER_SPATIAL_LAYERS, 2)) - die_codec(&codec, "Failed to set number of spatial layers to 2"); - - // Encode frames. - while (aom_img_read(&raw0, infile0)) { - int flags = 0; - - // configure and encode base layer - - if (keyframe_interval > 0 && frames_encoded % keyframe_interval == 0) - flags |= AOM_EFLAG_FORCE_KF; - else - // use previous base layer (LAST) as sole reference - // save this frame as LAST to be used as reference by enhanmcent layer - // and next base layer - flags |= AOM_EFLAG_NO_REF_LAST2 | AOM_EFLAG_NO_REF_LAST3 | - AOM_EFLAG_NO_REF_GF | AOM_EFLAG_NO_REF_ARF | - AOM_EFLAG_NO_REF_BWD | AOM_EFLAG_NO_REF_ARF2 | - AOM_EFLAG_NO_UPD_GF | AOM_EFLAG_NO_UPD_ARF | - AOM_EFLAG_NO_UPD_ENTROPY; - cfg.g_w = info.frame_width; - cfg.g_h = info.frame_height; - if (aom_codec_enc_config_set(&codec, &cfg)) - die_codec(&codec, "Failed to set enc cfg for layer 0"); - if (aom_codec_control(&codec, AOME_SET_SPATIAL_LAYER_ID, 0)) - die_codec(&codec, "Failed to set layer id to 0"); - if (aom_codec_control(&codec, AOME_SET_CQ_LEVEL, 62)) - die_codec(&codec, "Failed to set cq level"); - encode_frame(&codec, &raw0, frame_count++, flags, outfile); - - // configure and encode enhancement layer - - // use LAST (base layer) as sole reference - flags = AOM_EFLAG_NO_REF_LAST2 | AOM_EFLAG_NO_REF_LAST3 | - AOM_EFLAG_NO_REF_GF | AOM_EFLAG_NO_REF_ARF | AOM_EFLAG_NO_REF_BWD | - AOM_EFLAG_NO_REF_ARF2 | AOM_EFLAG_NO_UPD_LAST | - AOM_EFLAG_NO_UPD_GF | AOM_EFLAG_NO_UPD_ARF | - AOM_EFLAG_NO_UPD_ENTROPY; - cfg.g_w = info.frame_width; - cfg.g_h = info.frame_height; - aom_img_read(&raw1, infile1); - if (aom_codec_enc_config_set(&codec, &cfg)) - die_codec(&codec, "Failed to set enc cfg for layer 1"); - if (aom_codec_control(&codec, AOME_SET_SPATIAL_LAYER_ID, 1)) - die_codec(&codec, "Failed to set layer id to 1"); - if (aom_codec_control(&codec, AOME_SET_CQ_LEVEL, 10)) - die_codec(&codec, "Failed to set cq level"); - encode_frame(&codec, &raw1, frame_count++, flags, outfile); - - frames_encoded++; - - if (max_frames > 0 && frames_encoded >= max_frames) break; - } - - // Flush encoder. - while (encode_frame(&codec, NULL, -1, 0, outfile)) continue; - - printf("\n"); - fclose(infile0); - fclose(infile1); - printf("Processed %d frames.\n", frame_count / 2); - - aom_img_free(&raw0); - aom_img_free(&raw1); - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec."); - - fclose(outfile); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/set_maps.c b/third_party/aom/examples/set_maps.c deleted file mode 100644 index 9aeb96e43..000000000 --- a/third_party/aom/examples/set_maps.c +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// AOM Set Active and ROI Maps -// =========================== -// -// This is an example demonstrating how to control the AOM encoder's -// ROI and Active maps. -// -// ROI (Reigon of Interest) maps are a way for the application to assign -// each macroblock in the image to a region, and then set quantizer and -// filtering parameters on that image. -// -// Active maps are a way for the application to specify on a -// macroblock-by-macroblock basis whether there is any activity in that -// macroblock. -// -// -// Configuration -// ------------- -// An ROI map is set on frame 22. If the width of the image in macroblocks -// is evenly divisble by 4, then the output will appear to have distinct -// columns, where the quantizer, loopfilter, and static threshold differ -// from column to column. -// -// An active map is set on frame 33. If the width of the image in macroblocks -// is evenly divisble by 4, then the output will appear to have distinct -// columns, where one column will have motion and the next will not. -// -// The active map is cleared on frame 44. -// -// Observing The Effects -// --------------------- -// Use the `simple_decoder` example to decode this sample, and observe -// the change in the image at frames 22, 33, and 44. - -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_encoder.h" -#include "aom/aomcx.h" -#include "common/tools_common.h" -#include "common/video_writer.h" - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, "Usage: %s <codec> <width> <height> <infile> <outfile>\n", - exec_name); - exit(EXIT_FAILURE); -} - -static void set_active_map(const aom_codec_enc_cfg_t *cfg, - aom_codec_ctx_t *codec) { - unsigned int i; - aom_active_map_t map = { 0, 0, 0 }; - - map.rows = (cfg->g_h + 15) / 16; - map.cols = (cfg->g_w + 15) / 16; - - map.active_map = (uint8_t *)malloc(map.rows * map.cols); - for (i = 0; i < map.rows * map.cols; ++i) map.active_map[i] = i % 2; - - if (aom_codec_control(codec, AOME_SET_ACTIVEMAP, &map)) - die_codec(codec, "Failed to set active map"); - - free(map.active_map); -} - -static void unset_active_map(const aom_codec_enc_cfg_t *cfg, - aom_codec_ctx_t *codec) { - aom_active_map_t map = { 0, 0, 0 }; - - map.rows = (cfg->g_h + 15) / 16; - map.cols = (cfg->g_w + 15) / 16; - map.active_map = NULL; - - if (aom_codec_control(codec, AOME_SET_ACTIVEMAP, &map)) - die_codec(codec, "Failed to set active map"); -} - -static int encode_frame(aom_codec_ctx_t *codec, aom_image_t *img, - int frame_index, AvxVideoWriter *writer) { - int got_pkts = 0; - aom_codec_iter_t iter = NULL; - const aom_codec_cx_pkt_t *pkt = NULL; - const aom_codec_err_t res = aom_codec_encode(codec, img, frame_index, 1, 0); - if (res != AOM_CODEC_OK) die_codec(codec, "Failed to encode frame"); - - while ((pkt = aom_codec_get_cx_data(codec, &iter)) != NULL) { - got_pkts = 1; - - if (pkt->kind == AOM_CODEC_CX_FRAME_PKT) { - const int keyframe = (pkt->data.frame.flags & AOM_FRAME_IS_KEY) != 0; - if (!aom_video_writer_write_frame(writer, pkt->data.frame.buf, - pkt->data.frame.sz, - pkt->data.frame.pts)) { - die_codec(codec, "Failed to write compressed frame"); - } - - printf(keyframe ? "K" : "."); - fflush(stdout); - } - } - - return got_pkts; -} - -int main(int argc, char **argv) { - FILE *infile = NULL; - aom_codec_ctx_t codec; - aom_codec_enc_cfg_t cfg; - int frame_count = 0; - const int limit = 15; - aom_image_t raw; - aom_codec_err_t res; - AvxVideoInfo info; - AvxVideoWriter *writer = NULL; - const AvxInterface *encoder = NULL; - const int fps = 2; // TODO(dkovalev) add command line argument - const double bits_per_pixel_per_frame = 0.067; - - exec_name = argv[0]; - if (argc != 6) die("Invalid number of arguments"); - - memset(&info, 0, sizeof(info)); - - encoder = get_aom_encoder_by_name(argv[1]); - if (encoder == NULL) { - die("Unsupported codec."); - } - assert(encoder != NULL); - info.codec_fourcc = encoder->fourcc; - info.frame_width = (int)strtol(argv[2], NULL, 0); - info.frame_height = (int)strtol(argv[3], NULL, 0); - info.time_base.numerator = 1; - info.time_base.denominator = fps; - - if (info.frame_width <= 0 || info.frame_height <= 0 || - (info.frame_width % 2) != 0 || (info.frame_height % 2) != 0) { - die("Invalid frame size: %dx%d", info.frame_width, info.frame_height); - } - - if (!aom_img_alloc(&raw, AOM_IMG_FMT_I420, info.frame_width, - info.frame_height, 1)) { - die("Failed to allocate image."); - } - - printf("Using %s\n", aom_codec_iface_name(encoder->codec_interface())); - - res = aom_codec_enc_config_default(encoder->codec_interface(), &cfg, 0); - if (res) die_codec(&codec, "Failed to get default codec config."); - - cfg.g_w = info.frame_width; - cfg.g_h = info.frame_height; - cfg.g_timebase.num = info.time_base.numerator; - cfg.g_timebase.den = info.time_base.denominator; - cfg.rc_target_bitrate = - (unsigned int)(bits_per_pixel_per_frame * cfg.g_w * cfg.g_h * fps / 1000); - cfg.g_lag_in_frames = 0; - - writer = aom_video_writer_open(argv[5], kContainerIVF, &info); - if (!writer) die("Failed to open %s for writing.", argv[5]); - - if (!(infile = fopen(argv[4], "rb"))) - die("Failed to open %s for reading.", argv[4]); - - if (aom_codec_enc_init(&codec, encoder->codec_interface(), &cfg, 0)) - die_codec(&codec, "Failed to initialize encoder"); - - // Encode frames. - while (aom_img_read(&raw, infile) && frame_count < limit) { - ++frame_count; - - if (frame_count == 5) { - set_active_map(&cfg, &codec); - } else if (frame_count == 11) { - unset_active_map(&cfg, &codec); - } - - encode_frame(&codec, &raw, frame_count, writer); - } - - // Flush encoder. - while (encode_frame(&codec, NULL, -1, writer)) { - } - - printf("\n"); - fclose(infile); - printf("Processed %d frames.\n", frame_count); - - aom_img_free(&raw); - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec."); - - aom_video_writer_close(writer); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/simple_decoder.c b/third_party/aom/examples/simple_decoder.c deleted file mode 100644 index d098d1e0b..000000000 --- a/third_party/aom/examples/simple_decoder.c +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Simple Decoder -// ============== -// -// This is an example of a simple decoder loop. It takes an input file -// containing the compressed data (in IVF format), passes it through the -// decoder, and writes the decompressed frames to disk. Other decoder -// examples build upon this one. -// -// The details of the IVF format have been elided from this example for -// simplicity of presentation, as IVF files will not generally be used by -// your application. In general, an IVF file consists of a file header, -// followed by a variable number of frames. Each frame consists of a frame -// header followed by a variable length payload. The length of the payload -// is specified in the first four bytes of the frame header. The payload is -// the raw compressed data. -// -// Standard Includes -// ----------------- -// For decoders, you only have to include `aom_decoder.h` and then any -// header files for the specific codecs you use. In this case, we're using -// aom. -// -// Initializing The Codec -// ---------------------- -// The libaom decoder is initialized by the call to aom_codec_dec_init(). -// Determining the codec interface to use is handled by AvxVideoReader and the -// functions prefixed with aom_video_reader_. Discussion of those functions is -// beyond the scope of this example, but the main gist is to open the input file -// and parse just enough of it to determine if it's a AVx file and which AVx -// codec is contained within the file. -// Note the NULL pointer passed to aom_codec_dec_init(). We do that in this -// example because we want the algorithm to determine the stream configuration -// (width/height) and allocate memory automatically. -// -// Decoding A Frame -// ---------------- -// Once the frame has been read into memory, it is decoded using the -// `aom_codec_decode` function. The call takes a pointer to the data -// (`frame`) and the length of the data (`frame_size`). No application data -// is associated with the frame in this example, so the `user_priv` -// parameter is NULL. -// -// Codecs may produce a variable number of output frames for every call to -// `aom_codec_decode`. These frames are retrieved by the -// `aom_codec_get_frame` iterator function. The iterator variable `iter` is -// initialized to NULL each time `aom_codec_decode` is called. -// `aom_codec_get_frame` is called in a loop, returning a pointer to a -// decoded image or NULL to indicate the end of list. -// -// Processing The Decoded Data -// --------------------------- -// In this example, we simply write the encoded data to disk. It is -// important to honor the image's `stride` values. -// -// Cleanup -// ------- -// The `aom_codec_destroy` call frees any memory allocated by the codec. -// -// Error Handling -// -------------- -// This example does not special case any error return codes. If there was -// an error, a descriptive message is printed and the program exits. With -// few exceptions, aom_codec functions return an enumerated error status, -// with the value `0` indicating success. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_decoder.h" -#include "common/tools_common.h" -#include "common/video_reader.h" - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, "Usage: %s <infile> <outfile>\n", exec_name); - exit(EXIT_FAILURE); -} - -int main(int argc, char **argv) { - int frame_cnt = 0; - FILE *outfile = NULL; - aom_codec_ctx_t codec; - AvxVideoReader *reader = NULL; - const AvxInterface *decoder = NULL; - const AvxVideoInfo *info = NULL; - - exec_name = argv[0]; - - if (argc != 3) die("Invalid number of arguments."); - - reader = aom_video_reader_open(argv[1]); - if (!reader) die("Failed to open %s for reading.", argv[1]); - - if (!(outfile = fopen(argv[2], "wb"))) - die("Failed to open %s for writing.", argv[2]); - - info = aom_video_reader_get_info(reader); - - decoder = get_aom_decoder_by_fourcc(info->codec_fourcc); - if (!decoder) die("Unknown input codec."); - - printf("Using %s\n", aom_codec_iface_name(decoder->codec_interface())); - - if (aom_codec_dec_init(&codec, decoder->codec_interface(), NULL, 0)) - die_codec(&codec, "Failed to initialize decoder."); - - while (aom_video_reader_read_frame(reader)) { - aom_codec_iter_t iter = NULL; - aom_image_t *img = NULL; - size_t frame_size = 0; - const unsigned char *frame = - aom_video_reader_get_frame(reader, &frame_size); - if (aom_codec_decode(&codec, frame, frame_size, NULL)) - die_codec(&codec, "Failed to decode frame."); - - while ((img = aom_codec_get_frame(&codec, &iter)) != NULL) { - aom_img_write(img, outfile); - ++frame_cnt; - } - } - - printf("Processed %d frames.\n", frame_cnt); - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec"); - - printf("Play: ffplay -f rawvideo -pix_fmt yuv420p -s %dx%d %s\n", - info->frame_width, info->frame_height, argv[2]); - - aom_video_reader_close(reader); - - fclose(outfile); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/simple_encoder.c b/third_party/aom/examples/simple_encoder.c deleted file mode 100644 index 01a37cf0c..000000000 --- a/third_party/aom/examples/simple_encoder.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Simple Encoder -// ============== -// -// This is an example of a simple encoder loop. It takes an input file in -// YV12 format, passes it through the encoder, and writes the compressed -// frames to disk in IVF format. Other decoder examples build upon this -// one. -// -// The details of the IVF format have been elided from this example for -// simplicity of presentation, as IVF files will not generally be used by -// your application. In general, an IVF file consists of a file header, -// followed by a variable number of frames. Each frame consists of a frame -// header followed by a variable length payload. The length of the payload -// is specified in the first four bytes of the frame header. The payload is -// the raw compressed data. -// -// Standard Includes -// ----------------- -// For encoders, you only have to include `aom_encoder.h` and then any -// header files for the specific codecs you use. In this case, we're using -// aom. -// -// Getting The Default Configuration -// --------------------------------- -// Encoders have the notion of "usage profiles." For example, an encoder -// may want to publish default configurations for both a video -// conferencing application and a best quality offline encoder. These -// obviously have very different default settings. Consult the -// documentation for your codec to see if it provides any default -// configurations. All codecs provide a default configuration, number 0, -// which is valid for material in the vacinity of QCIF/QVGA. -// -// Updating The Configuration -// --------------------------------- -// Almost all applications will want to update the default configuration -// with settings specific to their usage. Here we set the width and height -// of the video file to that specified on the command line. We also scale -// the default bitrate based on the ratio between the default resolution -// and the resolution specified on the command line. -// -// Initializing The Codec -// ---------------------- -// The encoder is initialized by the following code. -// -// Encoding A Frame -// ---------------- -// The frame is read as a continuous block (size width * height * 3 / 2) -// from the input file. If a frame was read (the input file has not hit -// EOF) then the frame is passed to the encoder. Otherwise, a NULL -// is passed, indicating the End-Of-Stream condition to the encoder. The -// `frame_cnt` is reused as the presentation time stamp (PTS) and each -// frame is shown for one frame-time in duration. The flags parameter is -// unused in this example. - -// Forced Keyframes -// ---------------- -// Keyframes can be forced by setting the AOM_EFLAG_FORCE_KF bit of the -// flags passed to `aom_codec_control()`. In this example, we force a -// keyframe every <keyframe-interval> frames. Note, the output stream can -// contain additional keyframes beyond those that have been forced using the -// AOM_EFLAG_FORCE_KF flag because of automatic keyframe placement by the -// encoder. -// -// Processing The Encoded Data -// --------------------------- -// Each packet of type `AOM_CODEC_CX_FRAME_PKT` contains the encoded data -// for this frame. We write a IVF frame header, followed by the raw data. -// -// Cleanup -// ------- -// The `aom_codec_destroy` call frees any memory allocated by the codec. -// -// Error Handling -// -------------- -// This example does not special case any error return codes. If there was -// an error, a descriptive message is printed and the program exits. With -// few exeptions, aom_codec functions return an enumerated error status, -// with the value `0` indicating success. -// -// Error Resiliency Features -// ------------------------- -// Error resiliency is controlled by the g_error_resilient member of the -// configuration structure. Use the `decode_with_drops` example to decode with -// frames 5-10 dropped. Compare the output for a file encoded with this example -// versus one encoded with the `simple_encoder` example. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_encoder.h" -#include "common/tools_common.h" -#include "common/video_writer.h" - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, - "Usage: %s <codec> <width> <height> <infile> <outfile> " - "<keyframe-interval> <error-resilient> <frames to encode>\n" - "See comments in simple_encoder.c for more information.\n", - exec_name); - exit(EXIT_FAILURE); -} - -static int encode_frame(aom_codec_ctx_t *codec, aom_image_t *img, - int frame_index, int flags, AvxVideoWriter *writer) { - int got_pkts = 0; - aom_codec_iter_t iter = NULL; - const aom_codec_cx_pkt_t *pkt = NULL; - const aom_codec_err_t res = - aom_codec_encode(codec, img, frame_index, 1, flags); - if (res != AOM_CODEC_OK) die_codec(codec, "Failed to encode frame"); - - while ((pkt = aom_codec_get_cx_data(codec, &iter)) != NULL) { - got_pkts = 1; - - if (pkt->kind == AOM_CODEC_CX_FRAME_PKT) { - const int keyframe = (pkt->data.frame.flags & AOM_FRAME_IS_KEY) != 0; - if (!aom_video_writer_write_frame(writer, pkt->data.frame.buf, - pkt->data.frame.sz, - pkt->data.frame.pts)) { - die_codec(codec, "Failed to write compressed frame"); - } - printf(keyframe ? "K" : "."); - fflush(stdout); - } - } - - return got_pkts; -} - -// TODO(tomfinegan): Improve command line parsing and add args for bitrate/fps. -int main(int argc, char **argv) { - FILE *infile = NULL; - aom_codec_ctx_t codec; - aom_codec_enc_cfg_t cfg; - int frame_count = 0; - aom_image_t raw; - aom_codec_err_t res; - AvxVideoInfo info; - AvxVideoWriter *writer = NULL; - const AvxInterface *encoder = NULL; - const int fps = 30; - const int bitrate = 200; - int keyframe_interval = 0; - int max_frames = 0; - int frames_encoded = 0; - const char *codec_arg = NULL; - const char *width_arg = NULL; - const char *height_arg = NULL; - const char *infile_arg = NULL; - const char *outfile_arg = NULL; - const char *keyframe_interval_arg = NULL; - - exec_name = argv[0]; - - // Clear explicitly, as simply assigning "{ 0 }" generates - // "missing-field-initializers" warning in some compilers. - memset(&info, 0, sizeof(info)); - - if (argc != 9) die("Invalid number of arguments"); - - codec_arg = argv[1]; - width_arg = argv[2]; - height_arg = argv[3]; - infile_arg = argv[4]; - outfile_arg = argv[5]; - keyframe_interval_arg = argv[6]; - max_frames = (int)strtol(argv[8], NULL, 0); - - encoder = get_aom_encoder_by_name(codec_arg); - if (!encoder) die("Unsupported codec."); - - info.codec_fourcc = encoder->fourcc; - info.frame_width = (int)strtol(width_arg, NULL, 0); - info.frame_height = (int)strtol(height_arg, NULL, 0); - info.time_base.numerator = 1; - info.time_base.denominator = fps; - - if (info.frame_width <= 0 || info.frame_height <= 0 || - (info.frame_width % 2) != 0 || (info.frame_height % 2) != 0) { - die("Invalid frame size: %dx%d", info.frame_width, info.frame_height); - } - - if (!aom_img_alloc(&raw, AOM_IMG_FMT_I420, info.frame_width, - info.frame_height, 1)) { - die("Failed to allocate image."); - } - - keyframe_interval = (int)strtol(keyframe_interval_arg, NULL, 0); - if (keyframe_interval < 0) die("Invalid keyframe interval value."); - - printf("Using %s\n", aom_codec_iface_name(encoder->codec_interface())); - - res = aom_codec_enc_config_default(encoder->codec_interface(), &cfg, 0); - if (res) die_codec(&codec, "Failed to get default codec config."); - - cfg.g_w = info.frame_width; - cfg.g_h = info.frame_height; - cfg.g_timebase.num = info.time_base.numerator; - cfg.g_timebase.den = info.time_base.denominator; - cfg.rc_target_bitrate = bitrate; - cfg.g_error_resilient = (aom_codec_er_flags_t)strtoul(argv[7], NULL, 0); - - writer = aom_video_writer_open(outfile_arg, kContainerIVF, &info); - if (!writer) die("Failed to open %s for writing.", outfile_arg); - - if (!(infile = fopen(infile_arg, "rb"))) - die("Failed to open %s for reading.", infile_arg); - - if (aom_codec_enc_init(&codec, encoder->codec_interface(), &cfg, 0)) - die_codec(&codec, "Failed to initialize encoder"); - - // Encode frames. - while (aom_img_read(&raw, infile)) { - int flags = 0; - if (keyframe_interval > 0 && frame_count % keyframe_interval == 0) - flags |= AOM_EFLAG_FORCE_KF; - encode_frame(&codec, &raw, frame_count++, flags, writer); - frames_encoded++; - if (max_frames > 0 && frames_encoded >= max_frames) break; - } - - // Flush encoder. - while (encode_frame(&codec, NULL, -1, 0, writer)) continue; - - printf("\n"); - fclose(infile); - printf("Processed %d frames.\n", frame_count); - - aom_img_free(&raw); - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec."); - - aom_video_writer_close(writer); - - return EXIT_SUCCESS; -} diff --git a/third_party/aom/examples/twopass_encoder.c b/third_party/aom/examples/twopass_encoder.c deleted file mode 100644 index a03bc6cc2..000000000 --- a/third_party/aom/examples/twopass_encoder.c +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Two Pass Encoder -// ================ -// -// This is an example of a two pass encoder loop. It takes an input file in -// YV12 format, passes it through the encoder twice, and writes the compressed -// frames to disk in IVF format. It builds upon the simple_encoder example. -// -// Twopass Variables -// ----------------- -// Twopass mode needs to track the current pass number and the buffer of -// statistics packets. -// -// Updating The Configuration -// --------------------------------- -// In two pass mode, the configuration has to be updated on each pass. The -// statistics buffer is passed on the last pass. -// -// Encoding A Frame -// ---------------- -// Encoding a frame in two pass mode is identical to the simple encoder -// example. -// -// Processing Statistics Packets -// ----------------------------- -// Each packet of type `AOM_CODEC_CX_FRAME_PKT` contains the encoded data -// for this frame. We write a IVF frame header, followed by the raw data. -// -// -// Pass Progress Reporting -// ----------------------------- -// It's sometimes helpful to see when each pass completes. -// -// -// Clean-up -// ----------------------------- -// Destruction of the encoder instance must be done on each pass. The -// raw image should be destroyed at the end as usual. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "aom/aom_encoder.h" -#include "common/tools_common.h" -#include "common/video_writer.h" - -static const char *exec_name; - -void usage_exit(void) { - fprintf(stderr, - "Usage: %s <codec> <width> <height> <infile> <outfile> " - "<limit(optional)>\n", - exec_name); - exit(EXIT_FAILURE); -} - -static int get_frame_stats(aom_codec_ctx_t *ctx, const aom_image_t *img, - aom_codec_pts_t pts, unsigned int duration, - aom_enc_frame_flags_t flags, - aom_fixed_buf_t *stats) { - int got_pkts = 0; - aom_codec_iter_t iter = NULL; - const aom_codec_cx_pkt_t *pkt = NULL; - const aom_codec_err_t res = aom_codec_encode(ctx, img, pts, duration, flags); - if (res != AOM_CODEC_OK) die_codec(ctx, "Failed to get frame stats."); - - while ((pkt = aom_codec_get_cx_data(ctx, &iter)) != NULL) { - got_pkts = 1; - - if (pkt->kind == AOM_CODEC_STATS_PKT) { - const uint8_t *const pkt_buf = pkt->data.twopass_stats.buf; - const size_t pkt_size = pkt->data.twopass_stats.sz; - stats->buf = realloc(stats->buf, stats->sz + pkt_size); - memcpy((uint8_t *)stats->buf + stats->sz, pkt_buf, pkt_size); - stats->sz += pkt_size; - } - } - - return got_pkts; -} - -static int encode_frame(aom_codec_ctx_t *ctx, const aom_image_t *img, - aom_codec_pts_t pts, unsigned int duration, - aom_enc_frame_flags_t flags, AvxVideoWriter *writer) { - int got_pkts = 0; - aom_codec_iter_t iter = NULL; - const aom_codec_cx_pkt_t *pkt = NULL; - const aom_codec_err_t res = aom_codec_encode(ctx, img, pts, duration, flags); - if (res != AOM_CODEC_OK) die_codec(ctx, "Failed to encode frame."); - - while ((pkt = aom_codec_get_cx_data(ctx, &iter)) != NULL) { - got_pkts = 1; - if (pkt->kind == AOM_CODEC_CX_FRAME_PKT) { - const int keyframe = (pkt->data.frame.flags & AOM_FRAME_IS_KEY) != 0; - - if (!aom_video_writer_write_frame(writer, pkt->data.frame.buf, - pkt->data.frame.sz, - pkt->data.frame.pts)) - die_codec(ctx, "Failed to write compressed frame."); - printf(keyframe ? "K" : "."); - fflush(stdout); - } - } - - return got_pkts; -} - -static aom_fixed_buf_t pass0(aom_image_t *raw, FILE *infile, - const AvxInterface *encoder, - const aom_codec_enc_cfg_t *cfg, int limit) { - aom_codec_ctx_t codec; - int frame_count = 0; - aom_fixed_buf_t stats = { NULL, 0 }; - - if (aom_codec_enc_init(&codec, encoder->codec_interface(), cfg, 0)) - die_codec(&codec, "Failed to initialize encoder"); - - // Calculate frame statistics. - while (aom_img_read(raw, infile) && frame_count < limit) { - ++frame_count; - get_frame_stats(&codec, raw, frame_count, 1, 0, &stats); - } - - // Flush encoder. - while (get_frame_stats(&codec, NULL, frame_count, 1, 0, &stats)) { - } - - printf("Pass 0 complete. Processed %d frames.\n", frame_count); - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec."); - - return stats; -} - -static void pass1(aom_image_t *raw, FILE *infile, const char *outfile_name, - const AvxInterface *encoder, const aom_codec_enc_cfg_t *cfg, - int limit) { - AvxVideoInfo info = { encoder->fourcc, - cfg->g_w, - cfg->g_h, - { cfg->g_timebase.num, cfg->g_timebase.den }, - 0 }; - AvxVideoWriter *writer = NULL; - aom_codec_ctx_t codec; - int frame_count = 0; - - writer = aom_video_writer_open(outfile_name, kContainerIVF, &info); - if (!writer) die("Failed to open %s for writing", outfile_name); - - if (aom_codec_enc_init(&codec, encoder->codec_interface(), cfg, 0)) - die_codec(&codec, "Failed to initialize encoder"); - - // Encode frames. - while (aom_img_read(raw, infile) && frame_count < limit) { - ++frame_count; - encode_frame(&codec, raw, frame_count, 1, 0, writer); - } - - // Flush encoder. - while (encode_frame(&codec, NULL, -1, 1, 0, writer)) { - } - - printf("\n"); - - if (aom_codec_destroy(&codec)) die_codec(&codec, "Failed to destroy codec."); - - aom_video_writer_close(writer); - - printf("Pass 1 complete. Processed %d frames.\n", frame_count); -} - -int main(int argc, char **argv) { - FILE *infile = NULL; - int w, h; - aom_codec_ctx_t codec; - aom_codec_enc_cfg_t cfg; - aom_image_t raw; - aom_codec_err_t res; - aom_fixed_buf_t stats; - - const AvxInterface *encoder = NULL; - const int fps = 30; // TODO(dkovalev) add command line argument - const int bitrate = 200; // kbit/s TODO(dkovalev) add command line argument - const char *const codec_arg = argv[1]; - const char *const width_arg = argv[2]; - const char *const height_arg = argv[3]; - const char *const infile_arg = argv[4]; - const char *const outfile_arg = argv[5]; - int limit = 0; - exec_name = argv[0]; - - if (argc < 6) die("Invalid number of arguments"); - - if (argc > 6) limit = (int)strtol(argv[6], NULL, 0); - - if (limit == 0) limit = 100; - - encoder = get_aom_encoder_by_name(codec_arg); - if (!encoder) die("Unsupported codec."); - - w = (int)strtol(width_arg, NULL, 0); - h = (int)strtol(height_arg, NULL, 0); - - if (w <= 0 || h <= 0 || (w % 2) != 0 || (h % 2) != 0) - die("Invalid frame size: %dx%d", w, h); - - if (!aom_img_alloc(&raw, AOM_IMG_FMT_I420, w, h, 1)) - die("Failed to allocate image", w, h); - - printf("Using %s\n", aom_codec_iface_name(encoder->codec_interface())); - - // Configuration - res = aom_codec_enc_config_default(encoder->codec_interface(), &cfg, 0); - if (res) die_codec(&codec, "Failed to get default codec config."); - - cfg.g_w = w; - cfg.g_h = h; - cfg.g_timebase.num = 1; - cfg.g_timebase.den = fps; - cfg.rc_target_bitrate = bitrate; - - if (!(infile = fopen(infile_arg, "rb"))) - die("Failed to open %s for reading", infile_arg); - - // Pass 0 - cfg.g_pass = AOM_RC_FIRST_PASS; - stats = pass0(&raw, infile, encoder, &cfg, limit); - - // Pass 1 - rewind(infile); - cfg.g_pass = AOM_RC_LAST_PASS; - cfg.rc_twopass_stats_in = stats; - pass1(&raw, infile, outfile_arg, encoder, &cfg, limit); - free(stats.buf); - - aom_img_free(&raw); - fclose(infile); - - return EXIT_SUCCESS; -} |