Merge remote-tracking branch 'qatar/master'
[ffmpeg.git] / libavformat / utils.c
index 55826be..d166d08 100644 (file)
@@ -571,7 +571,7 @@ static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
     return &pktl->pkt;
 }
 
-static void queue_attached_pictures(AVFormatContext *s)
+void avformat_queue_attached_pictures(AVFormatContext *s)
 {
     int i;
     for (i = 0; i < s->nb_streams; i++)
@@ -646,7 +646,7 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputForma
         goto fail;
     ff_id3v2_free_extra_meta(&id3v2_extra_meta);
 
-    queue_attached_pictures(s);
+    avformat_queue_attached_pictures(s);
 
     if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
         s->data_offset = avio_tell(s->pb);
@@ -874,30 +874,18 @@ static void compute_frame_duration(int *pnum, int *pden, AVStream *st,
 }
 
 static int is_intra_only(AVCodecContext *enc){
-    if(enc->codec_type == AVMEDIA_TYPE_AUDIO){
+    AVCodecDescriptor *desc;
+
+    if(enc->codec_type != AVMEDIA_TYPE_VIDEO)
         return 1;
-    }else if(enc->codec_type == AVMEDIA_TYPE_VIDEO){
-        switch(enc->codec_id){
-        case AV_CODEC_ID_MJPEG:
-        case AV_CODEC_ID_MJPEGB:
-        case AV_CODEC_ID_LJPEG:
-        case AV_CODEC_ID_PRORES:
-        case AV_CODEC_ID_RAWVIDEO:
-        case AV_CODEC_ID_V210:
-        case AV_CODEC_ID_DVVIDEO:
-        case AV_CODEC_ID_HUFFYUV:
-        case AV_CODEC_ID_FFVHUFF:
-        case AV_CODEC_ID_ASV1:
-        case AV_CODEC_ID_ASV2:
-        case AV_CODEC_ID_VCR1:
-        case AV_CODEC_ID_DNXHD:
-        case AV_CODEC_ID_JPEG2000:
-        case AV_CODEC_ID_MDEC:
-        case AV_CODEC_ID_UTVIDEO:
-            return 1;
-        default: break;
-        }
+
+    desc = av_codec_get_codec_descriptor(enc);
+    if (!desc) {
+        desc = avcodec_descriptor_get(enc->codec_id);
+        av_codec_set_codec_descriptor(enc, desc);
     }
+    if (desc)
+        return !!(desc->props & AV_CODEC_PROP_INTRA_ONLY);
     return 0;
 }
 
@@ -1997,7 +1985,7 @@ int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int f
     int ret = seek_frame_internal(s, stream_index, timestamp, flags);
 
     if (ret >= 0)
-        queue_attached_pictures(s);
+        avformat_queue_attached_pictures(s);
 
     return ret;
 }
@@ -2013,7 +2001,7 @@ int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int
         ret = s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
 
         if (ret >= 0)
-            queue_attached_pictures(s);
+            avformat_queue_attached_pictures(s);
         return ret;
     }
 
@@ -2321,6 +2309,10 @@ static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
         if (st->info->found_decoder >= 0 && avctx->pix_fmt == PIX_FMT_NONE)
             FAIL("unspecified pixel format");
         break;
+    case AVMEDIA_TYPE_SUBTITLE:
+        if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
+            FAIL("unspecified size");
+        break;
     case AVMEDIA_TYPE_DATA:
         if(avctx->codec_id == AV_CODEC_ID_NONE) return 1;
     }
@@ -2336,6 +2328,7 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option
     AVCodec *codec;
     int got_picture = 1, ret = 0;
     AVFrame picture;
+    AVSubtitle subtitle;
     AVPacket pkt = *avpkt;
 
     if (!avcodec_is_open(st->codec) && !st->info->found_decoder) {
@@ -2381,6 +2374,11 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option
         case AVMEDIA_TYPE_AUDIO:
             ret = avcodec_decode_audio4(st->codec, &picture, &got_picture, &pkt);
             break;
+        case AVMEDIA_TYPE_SUBTITLE:
+            ret = avcodec_decode_subtitle2(st->codec, &subtitle,
+                                           &got_picture, &pkt);
+            ret = pkt.size;
+            break;
         default:
             break;
         }
@@ -3381,6 +3379,8 @@ int avformat_write_header(AVFormatContext *s, AVDictionary **options)
 
     if(s->oformat->write_header){
         ret = s->oformat->write_header(s);
+        if (ret >= 0 && s->pb && s->pb->error < 0)
+            ret = s->pb->error;
         if (ret < 0)
             goto fail;
     }
@@ -3505,8 +3505,12 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt)
     int ret;
 
     if (!pkt) {
-        if (s->oformat->flags & AVFMT_ALLOW_FLUSH)
-            return s->oformat->write_packet(s, pkt);
+        if (s->oformat->flags & AVFMT_ALLOW_FLUSH) {
+            ret = s->oformat->write_packet(s, pkt);
+            if (ret >= 0 && s->pb && s->pb->error < 0)
+                ret = s->pb->error;
+            return ret;
+        }
         return 1;
     }
 
@@ -3516,6 +3520,8 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt)
         return ret;
 
     ret= s->oformat->write_packet(s, pkt);
+    if (ret >= 0 && s->pb && s->pb->error < 0)
+        ret = s->pb->error;
 
     if (ret >= 0)
         s->streams[pkt->stream_index]->nb_frames++;