Ошибка сегментации при обращении к qpscale_table в AVFrame - PullRequest
1 голос
/ 31 марта 2020

Я немного изменяю этот файл: https://gist.github.com/yohhoy/f0444d3fc47f2bb2d0e2 Этот код декодирует видео и делает OpenCV Mats из пикселей кадра по ходу.

В частности, я хочу только захватывать фреймы, которые имеют определенные c данные, связанные с макроблоками. Я пытаюсь получить эти данные следующим образом:

total_qp = get_total_qp(decframe->qscale_table, mb_width, mb_height, mb_stride);

Однако всякий раз, когда я пытаюсь получить доступ к данным путем итерации по этому массиву, я получаю ошибку сегментации:

static float get_total_qp(int8_t *qscale_table, int mb_width, int mb_height, int mb_stride)
{
    int mb_count = mb_height * mb_width;
    int y, x;
    float qp_total = 0.0f;
    for (y = 0; y < mb_height; y++) {
        for (x = 0; x < mb_width; x++) {
            qp_total += qscale_table[x + y * mb_stride]; <-- SEGFAULT here
        }
    }
    return qp_total;
}

Я также попытался отправить: frame->qscale_table

, и я попытался заполнить его, но это не компилируется, потому что он не может найти эту функцию:

int8_t *qscale_table = av_frame_get_qp_table(decframe->qscale_table, &mb_stride, &qscale_type);

Итак, мой вопрос заключается в следующем: учитывая AVFrame*, как мне обеспечить заполнение qscale_table и доступ к нему?

1 Ответ

1 голос
/ 08 апреля 2020

Оказывается, что qpscale_table не экспортируется в декодированный кадр после того, как декодирование происходит в h264de c. c.

Чтобы получить значения, мне пришлось изменить * Метод 1003 * в h264dec для экспорта qscale_table в кадр, например:

static int h264_export_qp_table(H264Context *h, AVFrame *f, H264Picture *p, int qp_type)
{
    AVBufferRef *ref = av_buffer_ref(p->qscale_table_buf);
    int offset = 2*h->mb_stride + 1;
    if(!ref)
        return AVERROR(ENOMEM);
    av_assert0(ref->size >= offset + h->mb_stride * ((f->height+15)/16));
    ref->size -= offset;
    ref->data += offset;
    return av_frame_set_qp_table(f, ref, h->mb_stride, f->qscale_type);
}

и добавление вызова в finalize_frame:

...
        if (CONFIG_MPEGVIDEO) {
            ff_print_debug_info2(h->avctx, dst, NULL,
                                 out->mb_type,
                                 out->qscale_table,
                                 out->motion_val,
                                 NULL,
                                 h->mb_width, h->mb_height, h->mb_stride, 1);
            // NT: make the qscale_table accessible!
            h264_export_qp_table(h, dst, out, FF_QSCALE_TYPE_H264);
        }
...

И затем перекомпилируйте FFmpeg используя эти инструкции: https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu

...