Merge commit 'e5419709f50593769037ab77d7102f82d9260784'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 9 Dec 2013 12:31:23 +0000 (13:31 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 9 Dec 2013 13:32:19 +0000 (14:32 +0100)
* commit 'e5419709f50593769037ab77d7102f82d9260784':
  lavc: remove the extended_data workarounds.

Conflicts:
libavcodec/utils.c

One hunk is not merged as not all codecs are updated yet

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

@@@ -2168,10 -1437,9 +2168,9 @@@ int attribute_align_arg avcodec_decode_
  int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
                                                AVFrame *frame,
                                                int *got_frame_ptr,
 -                                              AVPacket *avpkt)
 +                                              const AVPacket *avpkt)
  {
      AVCodecInternal *avci = avctx->internal;
-     int planar, channels;
      int ret = 0;
  
      *got_frame_ptr = 0;
@@@ -2304,96 -1482,8 +2303,84 @@@ fail
              av_frame_unref(frame);
      }
  
-     /* many decoders assign whole AVFrames, thus overwriting extended_data;
-      * make sure it's set correctly; assume decoders that actually use
-      * extended_data are doing it correctly */
-     if (*got_frame_ptr) {
-         planar   = av_sample_fmt_is_planar(frame->format);
-         channels = av_frame_get_channels(frame);
-         if (!(planar && channels > AV_NUM_DATA_POINTERS))
-             frame->extended_data = frame->data;
-     } else {
-         frame->extended_data = NULL;
-     }
 +    return ret;
 +}
 +
 +#define UTF8_MAX_BYTES 4 /* 5 and 6 bytes sequences should not be used */
 +static int recode_subtitle(AVCodecContext *avctx,
 +                           AVPacket *outpkt, const AVPacket *inpkt)
 +{
 +#if CONFIG_ICONV
 +    iconv_t cd = (iconv_t)-1;
 +    int ret = 0;
 +    char *inb, *outb;
 +    size_t inl, outl;
 +    AVPacket tmp;
 +#endif
 +
 +    if (avctx->sub_charenc_mode != FF_SUB_CHARENC_MODE_PRE_DECODER || inpkt->size == 0)
 +        return 0;
 +
 +#if CONFIG_ICONV
 +    cd = iconv_open("UTF-8", avctx->sub_charenc);
 +    av_assert0(cd != (iconv_t)-1);
 +
 +    inb = inpkt->data;
 +    inl = inpkt->size;
  
 +    if (inl >= INT_MAX / UTF8_MAX_BYTES - FF_INPUT_BUFFER_PADDING_SIZE) {
 +        av_log(avctx, AV_LOG_ERROR, "Subtitles packet is too big for recoding\n");
 +        ret = AVERROR(ENOMEM);
 +        goto end;
 +    }
 +
 +    ret = av_new_packet(&tmp, inl * UTF8_MAX_BYTES);
 +    if (ret < 0)
 +        goto end;
 +    outpkt->buf  = tmp.buf;
 +    outpkt->data = tmp.data;
 +    outpkt->size = tmp.size;
 +    outb = outpkt->data;
 +    outl = outpkt->size;
 +
 +    if (iconv(cd, &inb, &inl, &outb, &outl) == (size_t)-1 ||
 +        iconv(cd, NULL, NULL, &outb, &outl) == (size_t)-1 ||
 +        outl >= outpkt->size || inl != 0) {
 +        av_log(avctx, AV_LOG_ERROR, "Unable to recode subtitle event \"%s\" "
 +               "from %s to UTF-8\n", inpkt->data, avctx->sub_charenc);
 +        av_free_packet(&tmp);
 +        ret = AVERROR(errno);
 +        goto end;
 +    }
 +    outpkt->size -= outl;
 +    memset(outpkt->data + outpkt->size, 0, outl);
 +
 +end:
 +    if (cd != (iconv_t)-1)
 +        iconv_close(cd);
      return ret;
 +#else
 +    av_assert0(!"requesting subtitles recoding without iconv");
 +#endif
 +}
 +
 +static int utf8_check(const uint8_t *str)
 +{
 +    const uint8_t *byte;
 +    uint32_t codepoint, min;
 +
 +    while (*str) {
 +        byte = str;
 +        GET_UTF8(codepoint, *(byte++), return 0;);
 +        min = byte - str == 1 ? 0 : byte - str == 2 ? 0x80 :
 +              1 << (5 * (byte - str) - 4);
 +        if (codepoint < min || codepoint >= 0x110000 ||
 +            codepoint == 0xFFFE /* BOM */ ||
 +            codepoint >= 0xD800 && codepoint <= 0xDFFF /* surrogates */)
 +            return 0;
 +        str = byte;
 +    }
 +    return 1;
  }
  
  int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,