formats.c
上传用户:jxp0626
上传日期:2007-01-08
资源大小:102k
文件大小:8k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Unix_Linux

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <netinet/in.h>
  4. #include <linux/videodev.h>
  5. #include <linux/soundcard.h>
  6. #include <unistd.h>
  7. #include <fcntl.h>
  8. #include <sys/ioctl.h>
  9. #include <sys/mman.h>
  10. #include <errno.h>
  11. #include <sys/time.h>
  12. #include <getopt.h>
  13. #include <string.h>
  14. #include "mpegenc.h"
  15. AVFormat *first_format;
  16. /* XXX: suppress it ! */
  17. int data_out_size;
  18. const char *comment_string = 
  19. "+title=Test Video +author=FFMpeg +copyright=Free +comment=Generated by FFMpeg 1.0";
  20. void register_avformat(AVFormat *format)
  21. {
  22.     AVFormat **p;
  23.     p = &first_format;
  24.     while (*p != NULL) p = &(*p)->next;
  25.     *p = format;
  26.     format->next = NULL;
  27. }
  28. AVFormat *guess_format(const char *short_name, const char *filename, const char *mime_type)
  29. {
  30.     AVFormat *fmt, *fmt_found;
  31.     int score_max, score;
  32.     const char *ext, *p;
  33.     char ext1[32], *q;
  34.     /* find the proper file type */
  35.     fmt_found = NULL;
  36.     score_max = 0;
  37.     fmt = first_format;
  38.     while (fmt != NULL) {
  39.         score = 0;
  40.         if (fmt->name && short_name && !strcmp(fmt->name, short_name))
  41.             score += 100;
  42.         if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
  43.             score += 10;
  44.         if (filename && fmt->extensions) {
  45.             ext = strrchr(filename, '.');
  46.             if (ext) {
  47.                 ext++;
  48.                 p = fmt->extensions;
  49.                 for(;;) {
  50.                     q = ext1;
  51.                     while (*p != '' && *p != ',') 
  52.                         *q++ = *p++;
  53.                     *q = '';
  54.                     if (!strcasecmp(ext1, ext)) {
  55.                         score += 5;
  56.                         break;
  57.                     }
  58.                     if (*p == '') 
  59.                         break;
  60.                     p++;
  61.                 }
  62.             }
  63.         }
  64.         if (score > score_max) {
  65.             score_max = score;
  66.             fmt_found = fmt;
  67.         }
  68.         fmt = fmt->next;
  69.     }
  70.     return fmt_found;
  71. }   
  72. /* return TRUE if val is a prefix of str. If it returns TRUE, ptr is
  73.    set to the next character in 'str' after the prefix */
  74. int strstart(const char *str, const char *val, const char **ptr)
  75. {
  76.     const char *p, *q;
  77.     p = str;
  78.     q = val;
  79.     while (*q != '') {
  80.         if (*p != *q)
  81.             return 0;
  82.         p++;
  83.         q++;
  84.     }
  85.     if (ptr)
  86.         *ptr = p;
  87.     return 1;
  88. }
  89. /* simple formats */
  90. int raw_write_header(struct AVFormatContext *s)
  91. {
  92.     return 0;
  93. }
  94. int raw_write_audio(struct AVFormatContext *s, 
  95.                     unsigned char *buf, int size)
  96. {
  97.     put_buffer(&s->pb, buf, size);
  98.     put_flush_packet(&s->pb);
  99.     return 0;
  100. }
  101. int raw_write_video(struct AVFormatContext *s, 
  102.                     unsigned char *buf, int size)
  103. {
  104.     put_buffer(&s->pb, buf, size);
  105.     put_flush_packet(&s->pb);
  106.     return 0;
  107. }
  108. int raw_write_trailer(struct AVFormatContext *s)
  109. {
  110.     return 0;
  111. }
  112. AVFormat mp2_format = {
  113.     "mp2",
  114.     "MPEG audio layer 2",
  115.     "audio/x-mpeg",
  116.     "mp2,mp3",
  117.     CODEC_ID_MP2,
  118.     0,
  119.     raw_write_header,
  120.     raw_write_audio,
  121.     NULL,
  122.     raw_write_trailer,
  123. };
  124. AVFormat ac3_format = {
  125.     "ac3",
  126.     "raw ac3",
  127.     "audio/x-ac3", 
  128.     "ac3",
  129.     CODEC_ID_AC3,
  130.     0,
  131.     raw_write_header,
  132.     raw_write_audio,
  133.     NULL,
  134.     raw_write_trailer,
  135. };
  136. AVFormat h263_format = {
  137.     "h263",
  138.     "raw h263",
  139.     "video/x-h263",
  140.     "h263",
  141.     0,
  142.     CODEC_ID_H263,
  143.     raw_write_header,
  144.     NULL,
  145.     raw_write_video,
  146.     raw_write_trailer,
  147. };
  148. AVFormat mpeg1video_format = {
  149.     "mpeg1video",
  150.     "MPEG1 video",
  151.     "video/mpeg",
  152.     "mpg,mpeg",
  153.     0,
  154.     CODEC_ID_MPEG1VIDEO,
  155.     raw_write_header,
  156.     NULL,
  157.     raw_write_video,
  158.     raw_write_trailer,
  159. };
  160. /* encoder management */
  161. AVEncoder *first_encoder;
  162. void register_avencoder(AVEncoder *format)
  163. {
  164.     AVEncoder **p;
  165.     p = &first_encoder;
  166.     while (*p != NULL) p = &(*p)->next;
  167.     *p = format;
  168.     format->next = NULL;
  169. }
  170. int avencoder_open(AVEncodeContext *avctx, AVEncoder *codec)
  171. {
  172.     int ret;
  173.     avctx->codec = codec;
  174.     avctx->frame_number = 0;
  175.     avctx->priv_data = malloc(codec->priv_data_size);
  176.     if (!avctx->priv_data) 
  177.         return -ENOMEM;
  178.     memset(avctx->priv_data, 0, codec->priv_data_size);
  179.     ret = avctx->codec->init(avctx);
  180.     if (ret < 0) {
  181.         free(avctx->priv_data);
  182.         avctx->priv_data = NULL;
  183.         return ret;
  184.     }
  185.     return 0;
  186. }
  187. int avencoder_encode(AVEncodeContext *avctx, UINT8 *buf, int buf_size, void *data)
  188. {
  189.     int ret;
  190.     ret = avctx->codec->encode(avctx, buf, buf_size, data);
  191.     avctx->frame_number++;
  192.     return ret;
  193. }
  194. int avencoder_close(AVEncodeContext *avctx)
  195. {
  196.     if (avctx->codec->close)
  197.         avctx->codec->close(avctx);
  198.     free(avctx->priv_data);
  199.     avctx->priv_data = NULL;
  200.     return 0;
  201. }
  202. AVEncoder *avencoder_find(enum CodecID id)
  203. {
  204.     AVEncoder *p;
  205.     p = first_encoder;
  206.     while (p) {
  207.         if (p->id == id)
  208.             return p;
  209.         p = p->next;
  210.     }
  211.     return NULL;
  212. }
  213. void avencoder_string(char *buf, int buf_size, AVEncodeContext *enc)
  214. {
  215.     switch(enc->codec->type) {
  216.     case CODEC_TYPE_VIDEO:
  217.         snprintf(buf, buf_size,
  218.                  "Video: %s%s, %dx%d, %d fps, %d kb/s",
  219.                  enc->codec->name, enc->flags & CODEC_FLAG_HQ ? " (hq)" : "", 
  220.                  enc->width, enc->height, enc->rate, enc->bit_rate / 1000);
  221.         break;
  222.     case CODEC_TYPE_AUDIO:
  223.         snprintf(buf, buf_size,
  224.                  "Audio: %s, %d Hz, %s, %d kb/s",
  225.                  enc->codec->name, enc->rate,
  226.                  enc->channels == 2 ? "stereo" : "mono", 
  227.                  enc->bit_rate / 1000);
  228.         break;
  229.     default:
  230.         abort();
  231.     }
  232. }
  233. /* PutByteFormat */
  234. int init_put_byte(PutByteContext *s,
  235.                   unsigned char *buffer,
  236.                   int buffer_size,
  237.                   void *opaque,
  238.                   void (*write_packet)(void *opaque, UINT8 *buf, int buf_size),
  239.                   int (*write_seek)(void *opaque, long long offset, int whence))
  240. {
  241.     s->buffer = buffer;
  242.     s->buf_ptr = buffer;
  243.     s->buf_end = buffer + buffer_size;
  244.     s->opaque = opaque;
  245.     s->write_packet = write_packet;
  246.     s->write_seek = write_seek;
  247.     s->pos = 0;
  248.     s->must_flush = 0;
  249.     return 0;
  250. }
  251.                   
  252. static void flush_buffer(PutByteContext *s)
  253. {
  254.     if (s->buf_ptr > s->buffer) {
  255.         if (s->write_packet)
  256.             s->write_packet(s->opaque, s->buffer, s->buf_ptr - s->buffer);
  257.         s->pos += s->buf_ptr - s->buffer;
  258.     }
  259.     s->buf_ptr = s->buffer;
  260. }
  261. void put_byte(PutByteContext *s, int b)
  262. {
  263.     *(s->buf_ptr)++ = b;
  264.     if (s->buf_ptr >= s->buf_end) 
  265.         flush_buffer(s);
  266. }
  267. void put_buffer(PutByteContext *s, unsigned char *buf, int size)
  268. {
  269.     int len;
  270.     while (size > 0) {
  271.         len = (s->buf_end - s->buf_ptr);
  272.         if (len > size)
  273.             len = size;
  274.         memcpy(s->buf_ptr, buf, len);
  275.         s->buf_ptr += len;
  276.         if (s->buf_ptr >= s->buf_end) 
  277.             flush_buffer(s);
  278.         buf += len;
  279.         size -= len;
  280.     }
  281. }
  282. void put_flush_packet(PutByteContext *s)
  283. {
  284.     flush_buffer(s);
  285.     s->must_flush = 0;
  286. }
  287. long long put_seek(PutByteContext *s, long long offset, int whence)
  288. {
  289.     long long offset1;
  290.     if (whence != SEEK_CUR && whence != SEEK_SET)
  291.         return -1;
  292.     if (whence == SEEK_CUR) {
  293.         offset1 = s->pos + s->buf_ptr - s->buffer;
  294.         if (offset == 0)
  295.             return offset1;
  296.         offset += offset1;
  297.     }
  298.     offset1 = offset - s->pos;
  299.     if (!s->must_flush && 
  300.         offset1 >= 0 && offset1 < (s->buf_end - s->buffer)) {
  301.         /* can do the seek inside the buffer */
  302.         s->buf_ptr = s->buffer + offset1;
  303.     } else {
  304.         if (!s->write_seek)
  305.             return -1;
  306.         flush_buffer(s);
  307.         s->write_seek(s->opaque, offset, SEEK_SET);
  308.         s->pos = offset;
  309.         s->must_flush = 1;
  310.     }
  311.     return offset;
  312. }
  313. long long put_pos(PutByteContext *s)
  314. {
  315.     return put_seek(s, 0, SEEK_CUR);
  316. }
  317. void put_le32(PutByteContext *s, unsigned int val)
  318. {
  319.     put_byte(s, val);
  320.     put_byte(s, val >> 8);
  321.     put_byte(s, val >> 16);
  322.     put_byte(s, val >> 24);
  323. }
  324. void put_le64(PutByteContext *s, unsigned long long val)
  325. {
  326.     put_le32(s, val & 0xffffffff);
  327.     put_le32(s, val >> 32);
  328. }
  329. void put_le16(PutByteContext *s, unsigned int val)
  330. {
  331.     put_byte(s, val);
  332.     put_byte(s, val >> 8);
  333. }
  334. void put_tag(PutByteContext *s, char *tag)
  335. {
  336.     while (*tag) {
  337.         put_byte(s, *tag++);
  338.     }
  339. }