FFMPEG v2.1 и далее обеспечивают поддержку декодирования HEVC. Я попробовал элементарный поток входных бинов в качестве ввода для него, и да, я получил соответствующий файл YUV.FFMPEG, обеспечивающий поддержку декодирования HEVC
Теперь мой вопрос, так как я просто передаю элементарный поток в качестве ввода, как декодер разбирает его?
Я прошел через /libavformat/hevcdec.c
, который должен быть демультиплексором для HEVC
. Я знаю, что hevc_probe()
- это функция в hevcdec.c
, где он обнаруживает, может ли файл декодироваться декодером HEVC.
Определение hevc_probe() функция приводится ниже:
static int hevc_probe(AVProbeData *p)
{
uint32_t code = -1;
int vps = 0, sps = 0, pps = 0, irap = 0;
int i;
for (i = 0; i < p->buf_size - 1; i++) {
code = (code << 8) + p->buf[i];
if ((code & 0xffffff00) == 0x100) {
uint8_t nal2 = p->buf[i + 1];
int type = (code & 0x7E) >> 1;
if (code & 0x81) // forbidden and reserved zero bits
return 0;
if (nal2 & 0xf8) // reserved zero
return 0;
switch (type) {
case NAL_VPS: vps++; break;
case NAL_SPS: sps++; break;
case NAL_PPS: pps++; break;
case NAL_BLA_N_LP:
case NAL_BLA_W_LP:
case NAL_BLA_W_RADL:
case NAL_CRA_NUT:
case NAL_IDR_N_LP:
case NAL_IDR_W_RADL: irap++; break;
}
}
}
// printf("vps=%d, sps=%d, pps=%d, irap=%d\n", vps, sps, pps, irap);
if (vps && sps && pps && irap)
return AVPROBE_SCORE_EXTENSION + 1; // 1 more than .mpg
return 0;
}
В соответствии с все, что я прочитал, только если эта функция возвращает константу типа AVPROBE_SCORE_EXTENSION
, декодирование будет продолжаться. Однако он возвращает AVPROBE_SCORE_EXTENSION+1
Почему?
Также, как показано выше в коде, они принимают переменную type
из полученного входного битового кода и выполняют приращение в константах, таких как sps, pps и т. Д. Является ли обычная операция, которая должна выполняться парсером который может декодировать элементарный поток?
Было бы очень полезно каждому, если кто-нибудь сможет дать краткое изложение парсера декодера, который может декодировать элементарный поток.
Пожалуйста, помогите. Заранее спасибо.
Спасибо за ответ. Последнее, что действительно мне поможет: в каком разделе кода мне нужно указать расширение моего входного файла? В настоящее время код HEVC использует .bin в качестве входного файла, поэтому в этом разделе я должен это указать. Пожалуйста, ответьте на это. И что такое MKTAG? это что-то связано с расширением входных файлов? – sam
Я все еще немного не понимаю, чего вы пытаетесь достичь.Взяв с собой еще один из ваших вопросов, на который я только что ответил, я мог бы понять, что вы пытаетесь создать свою собственную пару demuxer/decoder. Это правильно? О MKTAG: это всего лишь четыре символа ASCII и превращает их в 32-разрядное число, например, FourCC (распространенное в форматах мультимедийных файлов), но не соответствующее расширениям файлов. –
Спасибо за ответ. Да, я создаю пару demuxer и decoder. Моя цель - всякий раз, когда в качестве ввода указывается файл .bin, должен быть вызван мой декодер. Поэтому мне нужно знать, где мне нужно указывать для проверки расширения. Согласился, что я не должен зависеть от расширения файла, так как любой фальшивый файл с .bin может быть задан как вход. Однако на данный момент мне нужно сделать этот demuxer с предположением, что я всегда предоставляю файл proper.bin в качестве ввода. Пожалуйста помоги. – sam