LINUX.ORG.RU

Вопросик по C++

 ,


0

2

Я дебажу chromium, хочу добавить в класс свой метод для теста. Класс DXVAVideoDecodeAccelerator наследник класса VideoDecodeAccelerator. Я хочу добавить в DXVAVideoDecodeAccelerator публичный метод InsertFrame().

Что я делаю
media/video/video_decode_accelerator.h

class MEDIA_GPU_EXPORT DXVAVideoDecodeAccelerator
    : public VideoDecodeAccelerator {
 public:


 void InsertFrame(int32_t picture_buffer_id, int64_t ts);
}




media/video/video_decode_accelerator.cc
void DXVAVideoDecodeAccelerator::InsertFrame(int32_t picture_buffer_id, int64_t ts)  {
  DVLOG(1) <<  picture_buffer_id << ":" <<  ts;
}


Далее в коде я вызываю
vda_->InsertFrame(picture.picture_buffer_id(), timestamp.InMicroseconds());


и выдает ошибку
error: no member named 'InsertFrame' in 'media::VideoDecodeAccelerator'


Обязательно ли декларировать этот метод в родительском классе VideoDecodeAccelerator? Если да, то печально, этот инклуд затрагивает много кода и пересборка часа 3 будет наверное... Как наиболее просто можно добавить в DXVAVideoDecodeAccelerator этот метод?


Вот исходники
https://source.chromium.org/chromium/chromium/src/ /master:media/gpu/windows/...
https://source.chromium.org/chromium/chromium/src/ /master:media/video/video_...

★★★★

У вас vda_ – объект класса VideoDecodeAccelerator, а не DXVAVideoDecodeAccelerator.

Siborgium ★★★★★
()

Если ты уверен что там DXVAVideoDecodeAccelerator то сделай принудительный каст. Если включен RTTI то dynamic_cast<DXVAVideoDecodeAccelerator*>(ptr)

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Это DXVAVideoDecodeAccelerator, потому что другие методы работают, которые там есть, например vda_->ReusePictureBuffer(). В самом VideoDecodeAccelerator метод ReusePictureBuffer не реализован

gobot ★★★★
() автор топика
Ответ на: комментарий от ox55ff

Да, виртуальная. Получается мне нужно обязательно в родительский класс сначала добавлять тоже виртуальную?

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Если хочешь по нормальному, то да. Но для теста можно сделать каст, как я тебе советовал вначале. Только учти, что дайнемик каст тормозит. В горячем коде лучше не вызывать, а закешировать где то.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Понятно, по простому значит не сделать. Тормозить никак нельзя, там видео декодирование идет. А кешировать как и где, в момент инициализации vda_? Создать что то типа

vda_dxva = dynamic_cast<DXVAVideoDecodeAccelerator*>(ptr)

Можно пример реально работающий, а то я пол дня буду втыкать, опыта в с++ нет практически

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot
if (auto vda_dxva = dynamic_cast<DXVAVideoDecodeAccelerator*>(vda_))
   vda_dxva->InsertFrame(picture.picture_buffer_id(), timestamp.InMicroseconds());
anonymous
()
Ответ на: комментарий от gobot

Далее в коде я вызываю

В каком файле и классе ты это делаешь? Там создай поле класса типа DXVAVideoDecodeAccelerator* и один раз проинициализируй его через dynamic_cast. dynamic_cast может вернуть nullptr, если приведение указателя невозможно. Для ссылок кинет исключение std::bad_cast. Поэтому тебе нужно проверить это. Потом можешь обращаться к этому полю. Будет быстро.

Я код хрома не знаю. Нужно смотреть, чтобы конкретно сказать.

ox55ff ★★★★★
()
Последнее исправление: ox55ff (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.