Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 5 Aug 2013 07:57:07 +0000 (09:57 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 5 Aug 2013 07:57:28 +0000 (09:57 +0200)
* qatar/master:
  mxfenc: switch to av_reallocp_array() and check allocation errors

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/mxfenc.c

@@@ -1391,156 -1275,10 +1393,158 @@@ static int mxf_write_partition(AVFormat
      }
  
      avio_flush(pb);
+     return 0;
  }
  
 +static int mxf_parse_dnxhd_frame(AVFormatContext *s, AVStream *st,
 +AVPacket *pkt)
 +{
 +    MXFContext *mxf = s->priv_data;
 +    MXFStreamContext *sc = st->priv_data;
 +    int i, cid;
 +    uint8_t* header_cid;
 +    int frame_size = 0;
 +
 +    if (mxf->header_written)
 +        return 1;
 +
 +    if (pkt->size < 43)
 +        return -1;
 +
 +    header_cid = pkt->data + 0x28;
 +    cid = header_cid[0] << 24 | header_cid[1] << 16 | header_cid[2] << 8 | header_cid[3];
 +
 +    if ((frame_size = avpriv_dnxhd_get_frame_size(cid)) < 0)
 +        return -1;
 +
 +    switch (cid) {
 +    case 1235:
 +        sc->index = 24;
 +        sc->component_depth = 10;
 +        break;
 +    case 1237:
 +        sc->index = 25;
 +        break;
 +    case 1238:
 +        sc->index = 26;
 +        break;
 +    case 1241:
 +        sc->index = 27;
 +        sc->component_depth = 10;
 +        break;
 +    case 1242:
 +        sc->index = 28;
 +        break;
 +    case 1243:
 +        sc->index = 29;
 +        break;
 +    case 1250:
 +        sc->index = 30;
 +        sc->component_depth = 10;
 +        break;
 +    case 1251:
 +        sc->index = 31;
 +        break;
 +    case 1252:
 +        sc->index = 32;
 +        break;
 +    case 1253:
 +        sc->index = 33;
 +        break;
 +    default:
 +        return -1;
 +    }
 +
 +    sc->codec_ul = &mxf_essence_container_uls[sc->index].codec_ul;
 +    sc->aspect_ratio = (AVRational){ 16, 9 };
 +
 +    mxf->edit_unit_byte_count = KAG_SIZE;
 +    for (i = 0; i < s->nb_streams; i++) {
 +        AVStream *st = s->streams[i];
 +        MXFStreamContext *sc = st->priv_data;
 +        if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
 +            mxf->edit_unit_byte_count += 16 + 4 + sc->aic.samples[0]*sc->aic.sample_size;
 +            mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
 +        } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
 +            mxf->edit_unit_byte_count += 16 + 4 + frame_size;
 +            mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
 +        }
 +    }
 +
 +    return 1;
 +}
 +
 +static int mxf_parse_dv_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt)
 +{
 +    MXFContext *mxf = s->priv_data;
 +    MXFStreamContext *sc = st->priv_data;
 +    uint8_t *vs_pack, *vsc_pack;
 +    int i, ul_index, frame_size, stype, pal;
 +
 +    if (mxf->header_written)
 +        return 1;
 +
 +    // Check for minimal frame size
 +    if (pkt->size < 120000)
 +        return -1;
 +
 +    vs_pack  = pkt->data + 80*5 + 48;
 +    vsc_pack = pkt->data + 80*5 + 53;
 +    stype    = vs_pack[3] & 0x1f;
 +    pal      = (vs_pack[3] >> 5) & 0x1;
 +
 +    if ((vs_pack[2] & 0x07) == 0x02)
 +        sc->aspect_ratio = (AVRational){ 16, 9 };
 +    else
 +        sc->aspect_ratio = (AVRational){ 4, 3 };
 +
 +    sc->interlaced = (vsc_pack[3] >> 4) & 0x01;
 +    // TODO: fix dv encoder to set proper FF/FS value in VSC pack
 +    // and set field dominance accordingly
 +    // av_log(s, AV_LOG_DEBUG, "DV vsc pack ff/ss = %x\n", vsc_pack[2] >> 6);
 +
 +    switch (stype) {
 +    case 0x18: // DV100 720p
 +        ul_index = 6 + pal;
 +        frame_size = pal ? 288000 : 240000;
 +        if (sc->interlaced) {
 +            av_log(s, AV_LOG_ERROR, "source marked as interlaced but codec profile is progressive\n");
 +            sc->interlaced = 0;
 +        }
 +        break;
 +    case 0x14: // DV100 1080i
 +        ul_index = 4 + pal;
 +        frame_size = pal ? 576000 : 480000;
 +        break;
 +    case 0x04: // DV50
 +        ul_index = 2 + pal;
 +        frame_size = pal ? 288000 : 240000;
 +        break;
 +    default: // DV25
 +        ul_index = 0 + pal;
 +        frame_size = pal ? 144000 : 120000;
 +    }
 +
 +    sc->index = ul_index + 16;
 +    sc->codec_ul =  &mxf_essence_container_uls[sc->index].codec_ul;
 +
 +    mxf->edit_unit_byte_count = KAG_SIZE;
 +    for (i = 0; i < s->nb_streams; i++) {
 +        AVStream *st = s->streams[i];
 +        MXFStreamContext *sc = st->priv_data;
 +        if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
 +            mxf->edit_unit_byte_count += 16 + 4 + sc->aic.samples[0]*sc->aic.sample_size;
 +            mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
 +        } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
 +            mxf->edit_unit_byte_count += 16 + 4 + frame_size;
 +            mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
 +        }
 +    }
 +
 +    return 1;
 +}
 +
  static const UID mxf_mpeg2_codec_uls[] = {
      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x10,0x00 }, // MP-ML I-Frame
      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x11,0x00 }, // MP-ML Long GOP