Что такое таблицы квантования по умолчанию для потока RTP/MJPEG?

Столкнулся с проблемой при декодировании RTP/MJPEG потока с ip-камеры.

Как указано в rfc2435, таблицы квантования (для значений Q 1 ‹= Q ‹= 99) должны рассчитываться из этих таблиц по умолчанию:

/*
* Table K.1 from JPEG spec.
*/
static const int jpeg_luma_quantizer[64] = {
    16, 11, 10, 16, 24, 40, 51, 61,
    12, 12, 14, 19, 26, 58, 60, 55,
    14, 13, 16, 24, 40, 57, 69, 56,
    14, 17, 22, 29, 51, 87, 80, 62,
    18, 22, 37, 56, 68, 109, 103, 77,
    24, 35, 55, 64, 81, 104, 113, 92,
    49, 64, 78, 87, 103, 121, 120, 101,
    72, 92, 95, 98, 112, 100, 103, 99
};

/*
 * Table K.2 from JPEG spec.
 */
static const int jpeg_chroma_quantizer[64] = {
    17, 18, 24, 47, 99, 99, 99, 99,
    18, 21, 26, 66, 99, 99, 99, 99,
    24, 26, 56, 99, 99, 99, 99, 99,
    47, 66, 99, 99, 99, 99, 99, 99,
    99, 99, 99, 99, 99, 99, 99, 99,
    99, 99, 99, 99, 99, 99, 99, 99,
    99, 99, 99, 99, 99, 99, 99, 99,
    99, 99, 99, 99, 99, 99, 99, 99
};

Этот алгоритм приводит к плохому качеству картинки (vlc показывает лучше). Я просмотрел исходники ffmpeg и нашел аналогичный алгоритм, но с другими таблицами:

static const uint8_t default_quantizers[128] = {
    /* luma table */
    16,  11,  12,  14,  12,  10,  16,  14,
    13,  14,  18,  17,  16,  19,  24,  40,
    26,  24,  22,  22,  24,  49,  35,  37,
    29,  40,  58,  51,  61,  60,  57,  51,
    56,  55,  64,  72,  92,  78,  64,  68,
    87,  69,  55,  56,  80,  109, 81,  87,
    95,  98,  103, 104, 103, 62,  77,  113,
    121, 112, 100, 120, 92,  101, 103, 99,

    /* chroma table */
    17,  18,  18,  24,  21,  24,  47,  26,
    26,  47,  99,  66,  56,  66,  99,  99,
    99,  99,  99,  99,  99,  99,  99,  99,
    99,  99,  99,  99,  99,  99,  99,  99,
    99,  99,  99,  99,  99,  99,  99,  99,
    99,  99,  99,  99,  99,  99,  99,  99,
    99,  99,  99,  99,  99,  99,  99,  99,
    99,  99,  99,  99,  99,  99,  99,  99
};

Я изменил таблицы на таблицы ffmpeg, и теперь изображение выглядит идеально. Итак, чем эти таблицы отличаются от rfc2435? Что мне не хватает?


person stakasha    schedule 12.03.2014    source источник
comment
Rfc2435 теперь содержит опечатки, указывающие на использование аналогичных таблиц при q ‹= 50.   -  person Jay    schedule 15.12.2014


Ответы (2)


Разные таблицы лучше подходят для разного контента. Также лучшие столы находятся с течением времени. Поиск лучшей таблицы действительно является методом проб и ошибок с использованием человеческих оценок качества, а затем компромиссов в зависимости от типа контента, для которого вы хотите оптимизировать. ffmpeg также может создавать файлы большего размера. И файлы большего размера, возможно, были неприемлемы, когда изначально была написана спецификация jpeg.

person szatmary    schedule 12.03.2014
comment
Проблема в том, что в потоке RTP/MJPEG (для значений Q 1 ‹= Q ‹= 99) таблицы не предоставляются. Они предопределены стандартом полезной нагрузки RTP rfc2435. Если они предопределены, должен быть только один способ их вычисления. Я не могу понять, какой путь правильный. - person stakasha; 13.03.2014
comment
Я не уверен, почему это так. Я почти на пределе своих знаний о JPEG. Извините, удачи! – - person szatmary; 13.03.2014

Значения по умолчанию рассчитаны заранее, но вы также можете указать свои собственные значения для Q=100. См. мою реализацию @ https://net7mma.codeplex.com/SourceControl/latest#Rtp/RFC2435Frame.cs

person Jay    schedule 11.06.2014