Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 14 Jun 2012 22:09:39 +0000 (00:09 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 14 Jun 2012 22:14:21 +0000 (00:14 +0200)
* qatar/master:
  Avoid C99 variable declarations within for statements.
  rtmp: Read and handle incoming packets while writing data
  doc: document THREAD_TYPE fate variable
  rtpdec: Don't require frames to start with a Mode A packet
  avconv: don't try to free threads that were not initialized.

Conflicts:
doc/fate.texi
ffplay.c
libavdevice/dv1394.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
doc/fate.texi
ffmpeg.c
ffplay.c
libavcodec/pthread.c
libavdevice/dv1394.h
libavformat/rtmppkt.c
libavformat/rtmppkt.h
libavformat/rtmpproto.c
libavformat/rtpdec_h263_rfc2190.c

index 876a2e8..688c642 100644 (file)
@@ -169,6 +169,9 @@ the synchronisation of the samples directory.
 @item THREADS
     Specify how many threads to use while running regression tests, it is
     quite useful to detect thread-related regressions.
+@item THREAD_TYPE
+    Specify which threading strategy test, either @var{slice} or @var{frame},
+    by default @var{slice+frame}
 @item CPUFLAGS
     Specify CPU flags.
 @item TARGET_EXEC
index a606f03..4d37424 100644 (file)
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -3372,7 +3372,7 @@ static void free_input_threads(void)
         InputFile *f = input_files[i];
         AVPacket pkt;
 
-        if (f->joined)
+        if (!f->fifo || f->joined)
             continue;
 
         pthread_mutex_lock(&f->fifo_lock);
index 7cd3ba2..0644115 100644 (file)
--- a/ffplay.c
+++ b/ffplay.c
@@ -2687,14 +2687,13 @@ static void stream_cycle_channel(VideoState *is, int codec_type)
 
 static void toggle_full_screen(VideoState *is)
 {
-    av_unused int i;
-    is_full_screen = !is_full_screen;
 #if defined(__APPLE__) && SDL_VERSION_ATLEAST(1, 2, 14)
     /* OS X needs to reallocate the SDL overlays */
-    for (i = 0; i < VIDEO_PICTURE_QUEUE_SIZE; i++) {
+    int i;
+    for (i = 0; i < VIDEO_PICTURE_QUEUE_SIZE; i++)
         is->pictq[i].reallocate = 1;
-    }
 #endif
+    is_full_screen = !is_full_screen;
     video_open(is, 1);
 }
 
index 482c845..4d84d4c 100644 (file)
@@ -886,8 +886,8 @@ error:
 
 void ff_thread_flush(AVCodecContext *avctx)
 {
-    FrameThreadContext *fctx = avctx->thread_opaque;
     int i;
+    FrameThreadContext *fctx = avctx->thread_opaque;
 
     if (!avctx->thread_opaque) return;
 
index 1bab031..3d6033a 100644 (file)
               reset_dv1394();
          } else {
               int i;
-              for(i = 0; i < status.n_clear_frames; i++) {
+              for (i = 0; i < status.n_clear_frames; i++) {
                   copy_DV_frame();
               }
          }
index f0efa59..4b5f188 100644 (file)
@@ -74,15 +74,25 @@ void ff_amf_write_object_end(uint8_t **dst)
 int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
                         int chunk_size, RTMPPacket *prev_pkt)
 {
-    uint8_t hdr, t, buf[16];
+    uint8_t hdr;
+
+    if (ffurl_read(h, &hdr, 1) != 1)
+        return AVERROR(EIO);
+
+    return ff_rtmp_packet_read_internal(h, p, chunk_size, prev_pkt, hdr);
+}
+
+int ff_rtmp_packet_read_internal(URLContext *h, RTMPPacket *p, int chunk_size,
+                                 RTMPPacket *prev_pkt, uint8_t hdr)
+{
+
+    uint8_t t, buf[16];
     int channel_id, timestamp, data_size, offset = 0;
     uint32_t extra = 0;
     enum RTMPPacketType type;
     int size = 0;
     int ret;
 
-    if (ffurl_read(h, &hdr, 1) != 1)
-        return AVERROR(EIO);
     size++;
     channel_id = hdr & 0x3F;
 
index 8acbfc1..7291397 100644 (file)
@@ -115,6 +115,19 @@ void ff_rtmp_packet_destroy(RTMPPacket *pkt);
  */
 int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
                         int chunk_size, RTMPPacket *prev_pkt);
+/**
+ * Read internal RTMP packet sent by the server.
+ *
+ * @param h          reader context
+ * @param p          packet
+ * @param chunk_size current chunk size
+ * @param prev_pkt   previously read packet headers for all channels
+ *                   (may be needed for restoring incomplete packet header)
+ * @param c          the first byte already read
+ * @return number of bytes read on success, negative value otherwise
+ */
+int ff_rtmp_packet_read_internal(URLContext *h, RTMPPacket *p, int chunk_size,
+                                 RTMPPacket *prev_pkt, uint8_t c);
 
 /**
  * Send RTMP packet to the server.
index 5fcec07..03f959e 100644 (file)
@@ -1287,6 +1287,7 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size)
     int pktsize, pkttype;
     uint32_t ts;
     const uint8_t *buf_temp = buf;
+    uint8_t c;
     int ret;
 
     do {
@@ -1356,6 +1357,35 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size)
             rt->flv_header_bytes = 0;
         }
     } while (buf_temp - buf < size);
+
+    /* set stream into nonblocking mode */
+    rt->stream->flags |= AVIO_FLAG_NONBLOCK;
+
+    /* try to read one byte from the stream */
+    ret = ffurl_read(rt->stream, &c, 1);
+
+    /* switch the stream back into blocking mode */
+    rt->stream->flags &= ~AVIO_FLAG_NONBLOCK;
+
+    if (ret == AVERROR(EAGAIN)) {
+        /* no incoming data to handle */
+        return size;
+    } else if (ret < 0) {
+        return ret;
+    } else if (ret == 1) {
+        RTMPPacket rpkt = { 0 };
+
+        if ((ret = ff_rtmp_packet_read_internal(rt->stream, &rpkt,
+                                                rt->chunk_size,
+                                                rt->prev_pkt[0], c)) <= 0)
+             return ret;
+
+        if ((ret = rtmp_parse_result(s, rt, &rpkt)) < 0)
+            return ret;
+
+        ff_rtmp_packet_destroy(&rpkt);
+    }
+
     return size;
 }
 
index a3a4825..92102f3 100644 (file)
@@ -132,7 +132,7 @@ static int h263_handle_packet(AVFormatContext *ctx, PayloadContext *data,
     if (!data->buf) {
         /* Check the picture start code, only start buffering a new frame
          * if this is correct */
-        if (!f && len > 4 && AV_RB32(buf) >> 10 == 0x20) {
+        if (len > 4 && AV_RB32(buf) >> 10 == 0x20) {
             int ret = avio_open_dyn_buf(&data->buf);
             if (ret < 0)
                 return ret;