2015-07-09 4 views
1

Привет, я работаю над фильтром directshow для декодера. Для этого я использую библиотеку libde265. Но я столкнулся некоторые проблемы:Фильтр прямых показов с использованием libde265

HRESULT decoder::Transform(IMediaSample *pIn, IMediaSample *pOut) 
{ 
    FILE * fh; 

    tn++; 
    long sizein = 0; 
    BYTE *bufin; 
    BYTE *bufout; 
    BYTE *central_buffer; 
    int counter_tobuff = 0; 

    unsigned long nSrcDataSize; 
    unsigned long nMaxDestSize; 
    int totalbytes; 
    totalbytes = 0; 
    HRESULT   hr; 
    // get the input and output buffers 
    pIn->GetPointer(&bufin); 
    pOut->GetPointer(&bufout); 
    nSrcDataSize = pIn->GetActualDataLength(); 



    /**************************************de265.cc******************************************************/ 
    de265_error err; 





     /********Intilializing the decoder*******/ 
     if (tn == 1) 
     { 

      Init_decoder(); 

      //de265_start_worker_threads(ctx, 1); 
      //de265_set_parameter_bool(ctx, DE265_DECODER_PARAM_DUMP_PPS_HEADERS, false); 
     } 
     /********Setting the parameters ********/ 


     /*de265_set_parameter_bool(ctx, DE265_DECODER_PARAM_DUMP_PPS_HEADERS, true);*/ 






     err = de265_push_data(ctx, bufin,nSrcDataSize, 1, NULL); 



     pos += nSrcDataSize; 
     if (!de265_isOK(err)) { 

     } 
     int more = 0; 
     const de265_image * img; 
     do { 
      err = de265_decode(ctx, &more); 
      if (err == DE265_OK) 
      { 
       img = de265_get_next_picture(ctx); 

       if (img) 
       { 


        set_output_filename("D:\\testnotcreated.yuv"); 
        write_picture(img); 
        more = 0; 
       } 

      } 
      else 
      { 
       memcpy(bufout, bufin, nSrcDataSize); 
       more = 0; 

      } 


     } while (more); 
     counter_tobuff = 0; 


    /***************************************************************************************************/ 

     //nMaxDestSize = pOut->GetSize(); 
    hr = pOut->SetActualDataLength(nSrcDataSize); 
    //free(bufin); 
    if (FAILED(hr)) 
    { 

     //m_pDbg->SendDbg(APP_ID_RGB2YUY2, DBG_ERROR, "CRGB2YUY2::Transform SetActualDataLength failed"); 
     return S_FALSE; 
    } 

    return S_OK; 
} 

Что я предполагаю, что bufin непрерывно получать образцы и я должен передать его функции push_data, а затем декодировать его и записать в файл. Но этого не происходит. это не декодирование. Иногда он декодирует один или два кадра. Хотя этот код протестирован в exe, но разница в exe мы читаем данные из файла, и здесь мы работаем над непрерывным потоком. Так есть ли какая-то проблема в обработке данных, как непрерывный живой поток закодированного видео. Так что я могу сделать, чтобы разобраться в этом, чтобы он хорошо декодировал и записывал его в файл. Любая помощь будет действительно оценена, потому что я застрял.

+0

У libde265 уже есть декодер DirectShow, интегрированный в фильтры LAV, почему бы просто не использовать их? – Ralf

ответ

0

Порядок декодирования изображений в H.265 не совпадает с порядком отображения. Это означает, что иногда декодер должен задерживать вывод кадра, пока не будет достигнуто его положение отображения. Следовательно, для некоторых фреймов он ничего не выводит, а для других кадров он выдает несколько (буферизованных) кадров одновременно. Вы можете использовать пользовательские данные, чтобы определить, какой фрейм пришел с какого входа.