complete handling of pcm formats - hex dump option
authorFabrice Bellard <fabrice@bellard.org>
Sun, 23 Sep 2001 17:14:51 +0000 (17:14 +0000)
committerFabrice Bellard <fabrice@bellard.org>
Sun, 23 Sep 2001 17:14:51 +0000 (17:14 +0000)
Originally committed as revision 138 to svn://svn.ffmpeg.org/ffmpeg/trunk

ffmpeg.c

index a17eb216b998abdec91b96da06d513112da47510..e1409872e984eb0a5cdd30bafe02e26679794aca 100644 (file)
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -96,6 +96,7 @@ static char *str_author = NULL;
 static char *str_copyright = NULL;
 static char *str_comment = NULL;
 static int do_benchmark = 0;
+static int do_hex_dump = 0;
 
 typedef struct AVOutputStream {
     int file_index;          /* file index */
@@ -648,7 +649,7 @@ static void do_audio_out(AVFormatContext *s,
     }
 
     /* now encode as many frames as possible */
-    if (enc->codec_id != CODEC_ID_PCM) {
+    if (enc->frame_size > 1) {
         /* output resampled raw samples */
         fifo_write(&ost->fifo, buftmp, size_out, 
                    &ost->fifo.wptr);
@@ -657,13 +658,26 @@ static void do_audio_out(AVFormatContext *s,
         
         while (fifo_read(&ost->fifo, audio_buf, frame_bytes, 
                      &ost->fifo.rptr) == 0) {
-            ret = avcodec_encode_audio(enc,
-                                       audio_out, sizeof(audio_out), (short *)audio_buf);
+            ret = avcodec_encode_audio(enc, audio_out, sizeof(audio_out), 
+                                       (short *)audio_buf);
             s->format->write_packet(s, ost->index, audio_out, ret);
         }
     } else {
-        /* XXX: handle endianness */
-        s->format->write_packet(s, ost->index, buftmp, size_out);
+        /* output a pcm frame */
+        /* XXX: change encoding codec API to avoid this ? */
+        switch(enc->codec->id) {
+        case CODEC_ID_PCM_S16LE:
+        case CODEC_ID_PCM_S16BE:
+        case CODEC_ID_PCM_U16LE:
+        case CODEC_ID_PCM_U16BE:
+            break;
+        default:
+            size_out = size_out >> 1;
+            break;
+        }
+        ret = avcodec_encode_audio(enc, audio_out, size_out, 
+                                   (short *)buftmp);
+        s->format->write_packet(s, ost->index, audio_out, ret);
     }
 }
 
@@ -860,9 +874,6 @@ static void do_video_out(AVFormatContext *s,
         free(buf1);
 }
 
-//#define HEX_DUMP
-
-#ifdef HEX_DUMP
 static void hex_dump(UINT8 *buf, int size)
 {
     int len, i, j, c;
@@ -888,7 +899,6 @@ static void hex_dump(UINT8 *buf, int size)
         printf("\n");
     }
 }
-#endif
 
 /*
  * The following code is the main loop of the file converter
@@ -1191,10 +1201,10 @@ static int av_encode(AVFormatContext **output_files,
             continue;
         }
 
-#ifdef HEX_DUMP
-        printf("stream #%d, size=%d:\n", pkt.stream_index, pkt.size);
-        hex_dump(pkt.data, pkt.size);
-#endif
+        if (do_hex_dump) {
+            printf("stream #%d, size=%d:\n", pkt.stream_index, pkt.size);
+            hex_dump(pkt.data, pkt.size);
+        }
 
         //        printf("read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
 
@@ -1208,24 +1218,19 @@ static int av_encode(AVFormatContext **output_files,
             if (ist->decoding_needed) {
                 switch(ist->st->codec.codec_type) {
                 case CODEC_TYPE_AUDIO:
-                    if (ist->st->codec.codec_id == CODEC_ID_PCM) {
-                        /* no need to call a codec */
-                        data_buf = ptr;
-                        data_size = len;
-                        ret = len;
-                    } else {
-                        ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
-                                                   ptr, len);
-                        if (ret < 0)
-                            goto fail_decode;
-                        if (data_size == 0) {
-                            /* no audio frame */
-                            ptr += ret;
-                            len -= ret;
-                            continue;
-                        }
-                        data_buf = (UINT8 *)samples;
+                    /* XXX: could avoid copy if PCM 16 bits with same
+                       endianness as CPU */
+                    ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size,
+                                               ptr, len);
+                    if (ret < 0)
+                        goto fail_decode;
+                    if (data_size == 0) {
+                        /* no audio frame */
+                        ptr += ret;
+                        len -= ret;
+                        continue;
                     }
+                    data_buf = (UINT8 *)samples;
                     break;
                 case CODEC_TYPE_VIDEO:
                     if (ist->st->codec.codec_id == CODEC_ID_RAWVIDEO) {
@@ -2230,6 +2235,8 @@ const OptionDef options[] = {
       "deinterlace pictures" },
     { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark}, 
       "add timings for benchmarking" },
+    { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump}, 
+      "dump each input packet" },
 
     { NULL, },
 };