Merge commit 'e4dc1000d7bbbcb5b45cf9849fc5315f19578e37'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 18 May 2014 11:36:32 +0000 (13:36 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 18 May 2014 11:37:25 +0000 (13:37 +0200)
* commit 'e4dc1000d7bbbcb5b45cf9849fc5315f19578e37':
  yuv4mpeg: split the demuxer and muxer into separate files

Conflicts:
libavformat/yuv4mpegdec.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/Makefile
libavformat/yuv4mpeg.h
libavformat/yuv4mpegdec.c
libavformat/yuv4mpegenc.c

@@@ -431,17 -355,11 +431,17 @@@ OBJS-$(CONFIG_XBIN_DEMUXER
  OBJS-$(CONFIG_XMV_DEMUXER)               += xmv.o
  OBJS-$(CONFIG_XWMA_DEMUXER)              += xwma.o
  OBJS-$(CONFIG_YOP_DEMUXER)               += yop.o
- OBJS-$(CONFIG_YUV4MPEGPIPE_MUXER)        += yuv4mpeg.o
- OBJS-$(CONFIG_YUV4MPEGPIPE_DEMUXER)      += yuv4mpeg.o
+ OBJS-$(CONFIG_YUV4MPEGPIPE_MUXER)        += yuv4mpegenc.o
+ OBJS-$(CONFIG_YUV4MPEGPIPE_DEMUXER)      += yuv4mpegdec.o
  
  # external libraries
 +OBJS-$(CONFIG_LIBGME_DEMUXER)            += libgme.o
 +OBJS-$(CONFIG_LIBMODPLUG_DEMUXER)        += libmodplug.o
 +OBJS-$(CONFIG_LIBNUT_DEMUXER)            += libnut.o
 +OBJS-$(CONFIG_LIBNUT_MUXER)              += libnut.o
 +OBJS-$(CONFIG_LIBQUVI_DEMUXER)           += libquvi.o
  OBJS-$(CONFIG_LIBRTMP)                   += librtmp.o
 +OBJS-$(CONFIG_LIBSSH_PROTOCOL)           += libssh.o
  
  # protocols I/O
  OBJS-$(CONFIG_APPLEHTTP_PROTOCOL)        += hlsproto.o
index 0000000,7891ed6..750f498
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,27 +1,27 @@@
 - * This file is part of Libav.
+ /*
+  * YUV4MPEG common definitions
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #ifndef AVFORMAT_YUV4MPEG_H
+ #define AVFORMAT_YUV4MPEG_H
+ #define Y4M_MAGIC "YUV4MPEG2"
+ #define Y4M_FRAME_MAGIC "FRAME"
+ #endif /* AVFORMAT_YUV4MPEG_H */
@@@ -1,10 -1,10 +1,10 @@@
  /*
-  * YUV4MPEG format
+  * YUV4MPEG demuxer
   * Copyright (c) 2001, 2002, 2003 Fabrice Bellard
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
index 0000000,ed1ffea..3836a95
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,186 +1,309 @@@
 - * This file is part of Libav.
+ /*
+  * YUV4MPEG muxer
+  * Copyright (c) 2001, 2002, 2003 Fabrice Bellard
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
 -    AVPicture *picture;
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include "libavutil/pixdesc.h"
+ #include "avformat.h"
+ #include "internal.h"
+ #include "yuv4mpeg.h"
+ #define Y4M_LINE_MAX 256
+ static int yuv4_generate_header(AVFormatContext *s, char* buf)
+ {
+     AVStream *st;
+     int width, height;
+     int raten, rated, aspectn, aspectd, n;
+     char inter;
+     const char *colorspace = "";
+     st     = s->streams[0];
+     width  = st->codec->width;
+     height = st->codec->height;
+     av_reduce(&raten, &rated, st->codec->time_base.den,
+               st->codec->time_base.num, (1UL << 31) - 1);
+     aspectn = st->sample_aspect_ratio.num;
+     aspectd = st->sample_aspect_ratio.den;
+     if (aspectn == 0 && aspectd == 1)
+         aspectd = 0;  // 0:0 means unknown
+     inter = 'p'; /* progressive is the default */
+     if (st->codec->coded_frame && st->codec->coded_frame->interlaced_frame)
+         inter = st->codec->coded_frame->top_field_first ? 't' : 'b';
++    if (st->codec->field_order == AV_FIELD_PROGRESSIVE) {
++        inter = 'p';
++    } else if (st->codec->field_order == AV_FIELD_TB || st->codec->field_order == AV_FIELD_TT) {
++        inter = 't';
++    } else if (st->codec->field_order == AV_FIELD_BT || st->codec->field_order == AV_FIELD_BB) {
++        inter = 'b';
++    }
+     switch (st->codec->pix_fmt) {
+     case AV_PIX_FMT_GRAY8:
+         colorspace = " Cmono";
+         break;
++    case AV_PIX_FMT_GRAY16:
++        colorspace = " Cmono16";
++        break;
+     case AV_PIX_FMT_YUV411P:
+         colorspace = " C411 XYSCSS=411";
+         break;
+     case AV_PIX_FMT_YUV420P:
+         switch (st->codec->chroma_sample_location) {
+         case AVCHROMA_LOC_TOPLEFT: colorspace = " C420paldv XYSCSS=420PALDV"; break;
+         case AVCHROMA_LOC_LEFT:    colorspace = " C420mpeg2 XYSCSS=420MPEG2"; break;
+         default:                   colorspace = " C420jpeg XYSCSS=420JPEG";   break;
+         }
+         break;
+     case AV_PIX_FMT_YUV422P:
+         colorspace = " C422 XYSCSS=422";
+         break;
+     case AV_PIX_FMT_YUV444P:
+         colorspace = " C444 XYSCSS=444";
+         break;
++    case AV_PIX_FMT_YUV420P9:
++        colorspace = " C420p9 XYSCSS=420P9";
++        break;
++    case AV_PIX_FMT_YUV422P9:
++        colorspace = " C422p9 XYSCSS=422P9";
++        break;
++    case AV_PIX_FMT_YUV444P9:
++        colorspace = " C444p9 XYSCSS=444P9";
++        break;
++    case AV_PIX_FMT_YUV420P10:
++        colorspace = " C420p10 XYSCSS=420P10";
++        break;
++    case AV_PIX_FMT_YUV422P10:
++        colorspace = " C422p10 XYSCSS=422P10";
++        break;
++    case AV_PIX_FMT_YUV444P10:
++        colorspace = " C444p10 XYSCSS=444P10";
++        break;
++    case AV_PIX_FMT_YUV420P12:
++        colorspace = " C420p12 XYSCSS=420P12";
++        break;
++    case AV_PIX_FMT_YUV422P12:
++        colorspace = " C422p12 XYSCSS=422P12";
++        break;
++    case AV_PIX_FMT_YUV444P12:
++        colorspace = " C444p12 XYSCSS=444P12";
++        break;
++    case AV_PIX_FMT_YUV420P14:
++        colorspace = " C420p14 XYSCSS=420P14";
++        break;
++    case AV_PIX_FMT_YUV422P14:
++        colorspace = " C422p14 XYSCSS=422P14";
++        break;
++    case AV_PIX_FMT_YUV444P14:
++        colorspace = " C444p14 XYSCSS=444P14";
++        break;
++    case AV_PIX_FMT_YUV420P16:
++        colorspace = " C420p16 XYSCSS=420P16";
++        break;
++    case AV_PIX_FMT_YUV422P16:
++        colorspace = " C422p16 XYSCSS=422P16";
++        break;
++    case AV_PIX_FMT_YUV444P16:
++        colorspace = " C444p16 XYSCSS=444P16";
++        break;
+     }
+     /* construct stream header, if this is the first frame */
+     n = snprintf(buf, Y4M_LINE_MAX, "%s W%d H%d F%d:%d I%c A%d:%d%s\n",
+                  Y4M_MAGIC, width, height, raten, rated, inter,
+                  aspectn, aspectd, colorspace);
+     return n;
+ }
+ static int yuv4_write_packet(AVFormatContext *s, AVPacket *pkt)
+ {
+     AVStream *st = s->streams[pkt->stream_index];
+     AVIOContext *pb = s->pb;
 -    picture = (AVPicture *)pkt->data;
++    AVPicture *picture, picture_tmp;
+     int* first_pkt = s->priv_data;
+     int width, height, h_chroma_shift, v_chroma_shift;
+     int i;
+     char buf2[Y4M_LINE_MAX + 1];
+     char buf1[20];
+     uint8_t *ptr, *ptr1, *ptr2;
 -    if (st->codec->pix_fmt != AV_PIX_FMT_GRAY8) {
++    memcpy(&picture_tmp, pkt->data, sizeof(AVPicture));
++    picture = &picture_tmp;
+     /* for the first packet we have to output the header as well */
+     if (*first_pkt) {
+         *first_pkt = 0;
+         if (yuv4_generate_header(s, buf2) < 0) {
+             av_log(s, AV_LOG_ERROR,
+                    "Error. YUV4MPEG stream header write failed.\n");
+             return AVERROR(EIO);
+         } else {
+             avio_write(pb, buf2, strlen(buf2));
+         }
+     }
+     /* construct frame header */
+     snprintf(buf1, sizeof(buf1), "%s\n", Y4M_FRAME_MAGIC);
+     avio_write(pb, buf1, strlen(buf1));
+     width  = st->codec->width;
+     height = st->codec->height;
+     ptr = picture->data[0];
++
++    switch (st->codec->pix_fmt) {
++    case AV_PIX_FMT_GRAY8:
++    case AV_PIX_FMT_YUV411P:
++    case AV_PIX_FMT_YUV420P:
++    case AV_PIX_FMT_YUV422P:
++    case AV_PIX_FMT_YUV444P:
++        break;
++    case AV_PIX_FMT_GRAY16:
++    case AV_PIX_FMT_YUV420P9:
++    case AV_PIX_FMT_YUV422P9:
++    case AV_PIX_FMT_YUV444P9:
++    case AV_PIX_FMT_YUV420P10:
++    case AV_PIX_FMT_YUV422P10:
++    case AV_PIX_FMT_YUV444P10:
++    case AV_PIX_FMT_YUV420P12:
++    case AV_PIX_FMT_YUV422P12:
++    case AV_PIX_FMT_YUV444P12:
++    case AV_PIX_FMT_YUV420P14:
++    case AV_PIX_FMT_YUV422P14:
++    case AV_PIX_FMT_YUV444P14:
++    case AV_PIX_FMT_YUV420P16:
++    case AV_PIX_FMT_YUV422P16:
++    case AV_PIX_FMT_YUV444P16:
++        width *= 2;
++        break;
++    default:
++        av_log(s, AV_LOG_ERROR, "The pixel format '%s' is not supported.\n",
++               av_get_pix_fmt_name(st->codec->pix_fmt));
++        return AVERROR(EINVAL);
++    }
++
+     for (i = 0; i < height; i++) {
+         avio_write(pb, ptr, width);
+         ptr += picture->linesize[0];
+     }
 -        // Shift right, rounding up
 -        width  = -(-width  >> h_chroma_shift);
 -        height = -(-height >> v_chroma_shift);
++    if (st->codec->pix_fmt != AV_PIX_FMT_GRAY8 &&
++        st->codec->pix_fmt != AV_PIX_FMT_GRAY16) {
+         // Adjust for smaller Cb and Cr planes
+         av_pix_fmt_get_chroma_sub_sample(st->codec->pix_fmt, &h_chroma_shift,
+                                          &v_chroma_shift);
 -    if (s->streams[0]->codec->pix_fmt == AV_PIX_FMT_YUV411P) {
 -        av_log(s, AV_LOG_ERROR, "Warning: generating rarely used 4:1:1 YUV "
++        width  = FF_CEIL_RSHIFT(width,  h_chroma_shift);
++        height = FF_CEIL_RSHIFT(height, v_chroma_shift);
+         ptr1 = picture->data[1];
+         ptr2 = picture->data[2];
+         for (i = 0; i < height; i++) {     /* Cb */
+             avio_write(pb, ptr1, width);
+             ptr1 += picture->linesize[1];
+         }
+         for (i = 0; i < height; i++) {     /* Cr */
+             avio_write(pb, ptr2, width);
+             ptr2 += picture->linesize[2];
+         }
+     }
++
+     return 0;
+ }
+ static int yuv4_write_header(AVFormatContext *s)
+ {
+     int *first_pkt = s->priv_data;
+     if (s->nb_streams != 1)
+         return AVERROR(EIO);
+     if (s->streams[0]->codec->codec_id != AV_CODEC_ID_RAWVIDEO) {
+         av_log(s, AV_LOG_ERROR, "ERROR: Only rawvideo supported.\n");
+         return AVERROR_INVALIDDATA;
+     }
 -    } else if ((s->streams[0]->codec->pix_fmt != AV_PIX_FMT_YUV420P) &&
 -               (s->streams[0]->codec->pix_fmt != AV_PIX_FMT_YUV422P) &&
 -               (s->streams[0]->codec->pix_fmt != AV_PIX_FMT_GRAY8)   &&
 -               (s->streams[0]->codec->pix_fmt != AV_PIX_FMT_YUV444P)) {
 -        av_log(s, AV_LOG_ERROR, "ERROR: yuv4mpeg only handles yuv444p, "
 -               "yuv422p, yuv420p, yuv411p and gray pixel formats. "
++    switch (s->streams[0]->codec->pix_fmt) {
++    case AV_PIX_FMT_YUV411P:
++        av_log(s, AV_LOG_WARNING, "Warning: generating rarely used 4:1:1 YUV "
+                "stream, some mjpegtools might not work.\n");
 -    .mime_type         = "",
++        break;
++    case AV_PIX_FMT_GRAY8:
++    case AV_PIX_FMT_GRAY16:
++    case AV_PIX_FMT_YUV420P:
++    case AV_PIX_FMT_YUV422P:
++    case AV_PIX_FMT_YUV444P:
++        break;
++    case AV_PIX_FMT_YUV420P9:
++    case AV_PIX_FMT_YUV422P9:
++    case AV_PIX_FMT_YUV444P9:
++    case AV_PIX_FMT_YUV420P10:
++    case AV_PIX_FMT_YUV422P10:
++    case AV_PIX_FMT_YUV444P10:
++    case AV_PIX_FMT_YUV420P12:
++    case AV_PIX_FMT_YUV422P12:
++    case AV_PIX_FMT_YUV444P12:
++    case AV_PIX_FMT_YUV420P14:
++    case AV_PIX_FMT_YUV422P14:
++    case AV_PIX_FMT_YUV444P14:
++    case AV_PIX_FMT_YUV420P16:
++    case AV_PIX_FMT_YUV422P16:
++    case AV_PIX_FMT_YUV444P16:
++        if (s->streams[0]->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL) {
++            av_log(s, AV_LOG_ERROR, "'%s' is not a official yuv4mpegpipe pixel format. "
++                   "Use '-strict -1' to encode to this pixel format.\n",
++                   av_get_pix_fmt_name(s->streams[0]->codec->pix_fmt));
++            return AVERROR(EINVAL);
++        }
++        av_log(s, AV_LOG_WARNING, "Warning: generating non standard YUV stream. "
++               "Mjpegtools will not work.\n");
++        break;
++    default:
++        av_log(s, AV_LOG_ERROR, "ERROR: yuv4mpeg can only handle "
++               "yuv444p, yuv422p, yuv420p, yuv411p and gray8 pixel formats. "
++               "And using 'strict -1' also yuv444p9, yuv422p9, yuv420p9, "
++               "yuv444p10, yuv422p10, yuv420p10, "
++               "yuv444p12, yuv422p12, yuv420p12, "
++               "yuv444p14, yuv422p14, yuv420p14, "
++               "yuv444p16, yuv422p16, yuv420p16 "
++               "and gray16 pixel formats. "
+                "Use -pix_fmt to select one.\n");
+         return AVERROR(EIO);
+     }
+     *first_pkt = 1;
+     return 0;
+ }
+ AVOutputFormat ff_yuv4mpegpipe_muxer = {
+     .name              = "yuv4mpegpipe",
+     .long_name         = NULL_IF_CONFIG_SMALL("YUV4MPEG pipe"),
+     .extensions        = "y4m",
+     .priv_data_size    = sizeof(int),
+     .audio_codec       = AV_CODEC_ID_NONE,
+     .video_codec       = AV_CODEC_ID_RAWVIDEO,
+     .write_header      = yuv4_write_header,
+     .write_packet      = yuv4_write_packet,
+     .flags             = AVFMT_RAWPICTURE,
+ };