Ticket #1294: avci.patch

File avci.patch, 7.6 KB (added by Thomas Mundt, 4 years ago)
  • libavformat/internal.h

    old new  
    346346 
    347347void ff_free_stream(AVFormatContext *s, AVStream *st); 
    348348 
     349/** 
     350 * Generate standard extradata for AVC-Intra based on width/height and field order. 
     351 */ 
     352void ff_generate_avci_extradata(AVStream *st); 
     353 
    349354#endif /* AVFORMAT_INTERNAL_H */ 
  • libavformat/isom.c

    old new  
    165165    { AV_CODEC_ID_H264, MKTAG('a', 'i', '1', '3') }, /* AVC-Intra 100M 1080p24/30/60 */ 
    166166    { AV_CODEC_ID_H264, MKTAG('a', 'i', '1', '5') }, /* AVC-Intra 100M 1080i50 */ 
    167167    { AV_CODEC_ID_H264, MKTAG('a', 'i', '1', '6') }, /* AVC-Intra 100M 1080i60 */ 
     168    { AV_CODEC_ID_H264, MKTAG('A', 'V', 'i', 'n') }, /* AVC-Intra with implicit SPS/PPS */ 
    168169 
    169170    { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', '1', 'v', '1') }, /* Apple MPEG-1 Camcorder */ 
    170171    { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'e', 'g') }, /* MPEG */ 
  • libavformat/mov.c

    old new  
    21822182#endif 
    21832183    } 
    21842184 
     2185    if (!st->codec->extradata_size && st->codec->codec_id == AV_CODEC_ID_H264 && 
     2186        st->codec->codec_tag != MKTAG('a', 'v', 'c', '1')) { 
     2187        ff_generate_avci_extradata(st); 
     2188    } 
     2189 
    21852190    switch (st->codec->codec_id) { 
    21862191#if CONFIG_H261_DECODER 
    21872192    case AV_CODEC_ID_H261: 
  • libavformat/mxfdec.c

    old new  
    14841484        /* TODO: drop PictureEssenceCoding and SoundEssenceCompression, only check EssenceContainer */ 
    14851485        codec_ul = mxf_get_codec_ul(ff_mxf_codec_uls, &descriptor->essence_codec_ul); 
    14861486        st->codec->codec_id = codec_ul->id; 
    1487         if (descriptor->extradata) { 
    1488             st->codec->extradata = descriptor->extradata; 
    1489             st->codec->extradata_size = descriptor->extradata_size; 
    1490         } 
    14911487        if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { 
    14921488            source_track->intra_only = mxf_is_intra_only(descriptor); 
    14931489            container_ul = mxf_get_codec_ul(mxf_picture_essence_container_uls, essence_container_ul); 
     
    15011497                    av_log(mxf->fc, AV_LOG_INFO, "SegmentedFrame layout isn't currently supported\n"); 
    15021498                    break; 
    15031499                case FullFrame: 
     1500                    st->codec->field_order = AV_FIELD_PROGRESSIVE; 
    15041501                    break; 
    15051502                case OneField: 
    15061503                    /* Every other line is stored and needs to be duplicated. */ 
     
    15581555            } else if (st->codec->codec_id == AV_CODEC_ID_MP2) { 
    15591556                st->need_parsing = AVSTREAM_PARSE_FULL; 
    15601557            } 
     1558        } 
     1559        if (descriptor->extradata) { 
     1560            st->codec->extradata = descriptor->extradata; 
     1561            st->codec->extradata_size = descriptor->extradata_size; 
     1562        } else { 
     1563            ff_generate_avci_extradata(st); 
    15611564        } 
    15621565        if (st->codec->codec_type != AVMEDIA_TYPE_DATA && (*essence_container_ul)[15] > 0x01) { 
    15631566            /* TODO: decode timestamps */ 
  • libavformat/utils.c

    old new  
    46734673    av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec); 
    46744674    return AVERROR(EINVAL); 
    46754675} 
     4676 
     4677void ff_generate_avci_extradata(AVStream *st) 
     4678{ 
     4679    static const uint8_t avci100_1080p_extradata[] = { 
     4680        // SPS 
     4681        0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29, 
     4682        0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63, 
     4683        0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19, 
     4684        0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e, 
     4685        0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8, 
     4686        0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2, 
     4687        0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00, 
     4688        0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca, 
     4689        0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     4690        // PPS 
     4691        0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48, 
     4692        0xd0 
     4693    }; 
     4694    static const uint8_t avci100_1080i_extradata[] = { 
     4695        // SPS 
     4696        0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29, 
     4697        0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63, 
     4698        0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19, 
     4699        0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65, 
     4700        0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26, 
     4701        0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50, 
     4702        0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e, 
     4703        0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28, 
     4704        0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0, 
     4705        0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03, 
     4706        0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x00, 
     4707        // PPS 
     4708        0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48, 
     4709        0xd0 
     4710    }; 
     4711    static const uint8_t avci50_1080i_extradata[] = { 
     4712        // SPS 
     4713        0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28, 
     4714        0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18, 
     4715        0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c, 
     4716        0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61, 
     4717        0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06, 
     4718        0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63, 
     4719        0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19, 
     4720        0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16, 
     4721        0x81, 0x13, 0xf7, 0xff, 0x80, 0x01, 0x80, 0x02, 
     4722        0x71, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03, 
     4723        0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00, 
     4724        // PPS 
     4725        0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12, 
     4726        0x11 
     4727    }; 
     4728    static const uint8_t avci100_720p_extradata[] = { 
     4729        // SPS 
     4730        0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29, 
     4731        0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62, 
     4732        0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5, 
     4733        0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8, 
     4734        0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95, 
     4735        0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43, 
     4736        0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01, 
     4737        0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05, 
     4738        0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03, 
     4739        0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 
     4740        // PPS 
     4741        0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12, 
     4742        0x11 
     4743    }; 
     4744    int size = 0; 
     4745    const uint8_t *data = 0; 
     4746    if (st->codec->width == 1920) { 
     4747        if (st->codec->field_order == AV_FIELD_PROGRESSIVE) { 
     4748            data = avci100_1080p_extradata; 
     4749            size = sizeof(avci100_1080p_extradata); 
     4750        } else { 
     4751            data = avci100_1080i_extradata; 
     4752            size = sizeof(avci100_1080i_extradata); 
     4753        } 
     4754    } else if (st->codec->width == 1440) { 
     4755        data = avci50_1080i_extradata; 
     4756        size = sizeof(avci50_1080i_extradata); 
     4757    } else if (st->codec->width == 1280) { 
     4758        data = avci100_720p_extradata; 
     4759        size = sizeof(avci100_720p_extradata); 
     4760    } 
     4761    if (!size) 
     4762        return; 
     4763    av_freep(&st->codec->extradata); 
     4764    st->codec->extradata_size = 0; 
     4765    st->codec->extradata = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE); 
     4766    if (!st->codec->extradata) 
     4767        return; 
     4768    memcpy(st->codec->extradata, data, size); 
     4769    st->codec->extradata_size = size; 
     4770}