]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/dv.c
fixing CODEC_FLAG_GLOBAL_HEADER
[ffmpeg] / libavformat / dv.c
index d6d5fd938ca9ce2e899ab7f700cc4c7f88782558..1870b2634c78341bbf5ad49a048623aa36e32709 100644 (file)
 #define PAL_FRAME_SIZE  144000
 
 typedef struct DVDemuxContext {
-    int is_audio;
+    int       is_audio;
+    uint8_t   buf[PAL_FRAME_SIZE];
+    int       size;
 } DVDemuxContext;
 
 /* raw input */
 static int dv_read_header(AVFormatContext *s,
                           AVFormatParameters *ap)
 {
-    AVStream *vst;
-    //    AVStream *ast;
+    AVStream *vst, *ast;
+    DVDemuxContext *c = s->priv_data;
 
     vst = av_new_stream(s, 0);
     if (!vst)
@@ -38,43 +40,53 @@ static int dv_read_header(AVFormatContext *s,
     vst->codec.codec_type = CODEC_TYPE_VIDEO;
     vst->codec.codec_id = CODEC_ID_DVVIDEO;
 
-#if 0
+
     ast = av_new_stream(s, 1);
     if (!ast)
         return AVERROR_NOMEM;
 
     ast->codec.codec_type = CODEC_TYPE_AUDIO;
     ast->codec.codec_id = CODEC_ID_DVAUDIO;
-#endif
+    c->is_audio = 0;
+
     return 0;
 }
 
-/* XXX: build fake audio stream when DV audio decoder will be finished */
+static void __destruct_pkt(struct AVPacket *pkt)
+{
+    pkt->data = NULL; pkt->size = 0;
+    return;
+}
+
 static int dv_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
-    int ret, size, dsf;
-    uint8_t buf[4];
+    int ret, dsf;
+    DVDemuxContext *c = s->priv_data;
     
-    ret = get_buffer(&s->pb, buf, 4);
-    if (ret <= 0) 
-        return -EIO;
-    dsf = buf[3] & 0x80;
-    if (!dsf)
-        size = NTSC_FRAME_SIZE;
-    else
-        size = PAL_FRAME_SIZE;
-    
-    if (av_new_packet(pkt, size) < 0)
-        return -EIO;
-
-    pkt->stream_index = 0;
-    memcpy(pkt->data, buf, 4);
-    ret = get_buffer(&s->pb, pkt->data + 4, size - 4);
-    if (ret <= 0) {
-        av_free_packet(pkt);
-        return -EIO;
+    if (!c->is_audio) {
+        ret = get_buffer(&s->pb, c->buf, 4);
+        if (ret <= 0) 
+            return -EIO;
+        dsf = c->buf[3] & 0x80;
+        if (!dsf)
+            c->size = NTSC_FRAME_SIZE;
+        else
+            c->size = PAL_FRAME_SIZE;
+       
+       ret = get_buffer(&s->pb, c->buf + 4, c->size - 4);
+       if (ret <= 0)
+           return -EIO;
     }
-    return ret;
+    
+    av_init_packet(pkt);
+    pkt->destruct = __destruct_pkt;
+    pkt->data     = c->buf;
+    pkt->size     = c->size;
+    pkt->stream_index = c->is_audio;
+    pkt->flags   |= PKT_FLAG_KEY;
+    
+    c->is_audio = !c->is_audio;
+    return c->size;
 }
 
 static int dv_read_close(AVFormatContext *s)
@@ -93,7 +105,7 @@ static AVInputFormat dv_iformat = {
     .extensions = "dv",
 };
 
-#if 0
+
 int dv_write_header(struct AVFormatContext *s)
 {
     return 0;
@@ -125,11 +137,10 @@ AVOutputFormat dv_oformat = {
     dv_write_packet,
     dv_write_trailer,
 };
-#endif
 
 int dv_init(void)
 {
     av_register_input_format(&dv_iformat);
-    //    av_register_output_format(&dv_oformat);
+    av_register_output_format(&dv_oformat);
     return 0;
 }