2013-11-28 2 views
1

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 и т. Д. Является ли обычная операция, которая должна выполняться парсером который может декодировать элементарный поток?

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

Пожалуйста, помогите. Заранее спасибо.

ответ

4

Автоматическое определение типа потока данных является вероятностным вопросом. Определенная функция зонда ищет файлы определенного типа данных, но может ли быть абсолютно уверенным, что данные соответствуют этому типу? Как насчет ложных срабатываний? Например, многие мультимедийные файлы имеют подписи в первых 4 байтах, которые состоят из 4 символов ASCII. Если функция зонда проверила эти 4 символа и обнаружила, что случайный текстовый файл начинался с тех же 4 символов, это было бы ложным положительным.

Поскольку существуют различные факторы, которые могут влиять на обнаружение, функции зонда FFmpeg возвращают значение определенности в диапазоне от 0..100 («определенно НЕ соответствует». «Абсолютный - это тип»). AVPROBE_SCORE_EXTENSION определяется как 50. Некоторые типы файлов не имеют сильных сигнатур и лучшее, что может сделать функция зонда, это проверить расширение файла.

Куда я иду со всем этим: элементарные потоки могут быть немного сложными для автоматического обнаружения. Вот почему, собрав достаточное количество доказательств, обнаружение элементарного потока HEVC имеет достаточную уверенность, чтобы вернуть вероятность 51% этого потока HEVC. Поскольку FFmpeg управляет потоком через различные функции зонда, функция зонда другого формата может переопределить эту функцию, если она возвращает более чем на 51% достоверности.

Следует отметить, что элементарные потоки обычно не встречаются «в дикой природе». Они, как правило, упаковываются в другие форматы, которые лучше переносятся и обрабатываются (см. Программные потоки и транспортные потоки).

+0

Спасибо за ответ. Последнее, что действительно мне поможет: в каком разделе кода мне нужно указать расширение моего входного файла? В настоящее время код HEVC использует .bin в качестве входного файла, поэтому в этом разделе я должен это указать. Пожалуйста, ответьте на это. И что такое MKTAG? это что-то связано с расширением входных файлов? – sam

+2

Я все еще немного не понимаю, чего вы пытаетесь достичь.Взяв с собой еще один из ваших вопросов, на который я только что ответил, я мог бы понять, что вы пытаетесь создать свою собственную пару demuxer/decoder. Это правильно? О MKTAG: это всего лишь четыре символа ASCII и превращает их в 32-разрядное число, например, FourCC (распространенное в форматах мультимедийных файлов), но не соответствующее расширениям файлов. –

+0

Спасибо за ответ. Да, я создаю пару demuxer и decoder. Моя цель - всякий раз, когда в качестве ввода указывается файл .bin, должен быть вызван мой декодер. Поэтому мне нужно знать, где мне нужно указывать для проверки расширения. Согласился, что я не должен зависеть от расширения файла, так как любой фальшивый файл с .bin может быть задан как вход. Однако на данный момент мне нужно сделать этот demuxer с предположением, что я всегда предоставляю файл proper.bin в качестве ввода. Пожалуйста помоги. – sam

Смежные вопросы