x264 / libx264 : Можно ли использовать только один кадр ввода-вывода в качестве эталона для B-кадров?

#video #ffmpeg #h.264 #x264 #libx264

Вопрос:

Как вы знаете ref , параметр может задать количество предыдущих кадров, которые каждый P-кадр может использовать в качестве ссылок.

Мне нужно то же самое для B-кадров, но ref=1 это не работает для B-кадров.

Я имею в виду кадр ввода-вывода, который будет использоваться в качестве эталона только для B-кадров.

возможно ли это с помощью командной строки? или путем изменения следующей функции в исходном коде ?

 static inline int reference_update( x264_t *h )
{
if( !h->fdec->b_kept_as_ref )
{
    if( h->i_thread_frames > 1 )
    {
        x264_frame_push_unused( h, h->fdec );
        h->fdec = x264_frame_pop_unused( h, 1 );
        if( !h->fdec )
            return -1;
    }
    return 0;
}

/* apply mmco from previous frame. */
for( int i = 0; i < h->sh.i_mmco_command_count; i   )
    for( int j = 0; h->frames.reference[j]; j   )
        if( h->frames.reference[j]->i_poc == h->sh.mmco[i].i_poc )
            x264_frame_push_unused( h, x264_frame_shift( amp;h->frames.reference[j] ) );

/* move frame in the buffer */
x264_frame_push( h->frames.reference, h->fdec );
if( h->frames.reference[h->sps->i_num_ref_frames] )
    x264_frame_push_unused( h, x264_frame_shift( h->frames.reference ) );
h->fdec = x264_frame_pop_unused( h, 1 );
if( !h->fdec )
    return -1;
return 0;
}
 

Ответ №1:

Нет. B-кадр по определению двунаправленный, т. Е. он должен иметь по крайней мере 2 опорных кадра (один до и один после в порядке представления), в противном случае он вообще не имеет смысла и не будет отличаться от P-кадра.

Комментарии:

1. В потоке open-GOP после вырезания в I-кадре (не IDR) вы можете получить IBBPBB в порядке декодирования и BBIBBP в порядке представления, но в таком случае, если декодирование начинается с него, первые 2 B-кадра должны быть отброшены.

2. Еще один раз такой поток может быть вырезан, но эти B-кадры не поддаются декодированию (без артефактов и сокрытия ошибок). x264 также может кодировать open-GOP с --open-gop опцией. Покажите мне любой коммерческий кодер, который может закодировать его другим способом, и передайте образец, в котором эти B-кадры будут правильно декодироваться.

3. Они не могут, это вы сказали, что это возможно. Самое большее, что они могут сделать, это, как я сказал, закодировать open-gop и вырезать первый GOP, т. Е. Как этот образец, закодированный x264: test.zip или зеркало

4. ДА. Я посмотрел на него. Он действительно использует шаблон I(DR)BBPBBP. После этого я перечитал спецификации H. 264 и обнаружил, что в нем написано 8.2.4.2.3 Initialization process for reference picture lists for B slices in frames : When this process is invoked, there shall be at least one reference entry that is currently marked as "used for reference" (i.e., as "used for short-term reference" or "used for long-term reference") and is not marked as "non-existing". Так что, похоже, действительно можно использовать одну и ту же систему отсчета как для RefPicList0, так и для RefPicList1.

5. Но я не понимаю смысла таких B-кадров с точки зрения эффективности сжатия. Единственное, что для этого нужно, имхо,-это сохранить тот же неадаптивный шаблон фрейма с открытым исходным кодом в первом GOP, что и в следующих GOP.