Commit 3bbf3f7e authored by Michael Niedermayer's avatar Michael Niedermayer

Merge remote-tracking branch 'qatar/master'

* qatar/master:
  matroska: Clear prev_pkt between seeks.
  avutil: change default buffer size alignment for sample buffer functions
  audemux: Add a sanity check for the number of channels
  Remove libdirac decoder.
  matroska: Add incremental parsing of clusters.
  avconv: fix off by one check in complex_filter
  mpegts: Try seeking back even for nonseekable protocols
  swscale: K&R formatting cosmetics (part III)

Conflicts:
	configure
	doc/general.texi
	doc/platform.texi
	ffmpeg.c
	libavcodec/Makefile
	libavcodec/allcodecs.c
	libavcodec/libdirac.h
	libavcodec/libdiracdec.c
	libavformat/au.c
	libavformat/mpegts.c
	libswscale/input.c
	tests/ref/seek/lavf_mkv
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 2e8f19d2 7521c4ba
...@@ -179,7 +179,6 @@ External library support: ...@@ -179,7 +179,6 @@ External library support:
--enable-libcdio enable audio CD grabbing with libcdio --enable-libcdio enable audio CD grabbing with libcdio
--enable-libdc1394 enable IIDC-1394 grabbing using libdc1394 --enable-libdc1394 enable IIDC-1394 grabbing using libdc1394
and libraw1394 [no] and libraw1394 [no]
--enable-libdirac enable Dirac support via libdirac [no]
--enable-libfaac enable FAAC support via libfaac [no] --enable-libfaac enable FAAC support via libfaac [no]
--enable-libfreetype enable libfreetype [no] --enable-libfreetype enable libfreetype [no]
--enable-libgsm enable GSM support via libgsm [no] --enable-libgsm enable GSM support via libgsm [no]
...@@ -1035,7 +1034,6 @@ CONFIG_LIST=" ...@@ -1035,7 +1034,6 @@ CONFIG_LIST="
libcdio libcdio
libcelt libcelt
libdc1394 libdc1394
libdirac
libfaac libfaac
libfreetype libfreetype
libgsm libgsm
...@@ -1557,7 +1555,6 @@ h264_parser_select="golomb h264dsp h264pred" ...@@ -1557,7 +1555,6 @@ h264_parser_select="golomb h264dsp h264pred"
# external libraries # external libraries
libaacplus_encoder_deps="libaacplus" libaacplus_encoder_deps="libaacplus"
libcelt_decoder_deps="libcelt" libcelt_decoder_deps="libcelt"
libdirac_decoder_deps="libdirac !libschroedinger"
libfaac_encoder_deps="libfaac" libfaac_encoder_deps="libfaac"
libgsm_decoder_deps="libgsm" libgsm_decoder_deps="libgsm"
libgsm_encoder_deps="libgsm" libgsm_encoder_deps="libgsm"
...@@ -3200,9 +3197,6 @@ enabled libbluray && require libbluray libbluray/bluray.h bd_open -lbluray ...@@ -3200,9 +3197,6 @@ enabled libbluray && require libbluray libbluray/bluray.h bd_open -lbluray
enabled libcelt && require libcelt celt/celt.h celt_decode -lcelt0 && enabled libcelt && require libcelt celt/celt.h celt_decode -lcelt0 &&
{ check_lib celt/celt.h celt_decoder_create_custom -lcelt0 || { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
die "ERROR: libcelt version must be >= 0.11.0."; } die "ERROR: libcelt version must be >= 0.11.0."; }
enabled libdirac && require_pkg_config dirac \
"libdirac_decoder/dirac_parser.h" \
"dirac_decoder_init"
enabled libfaac && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac enabled libfaac && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
enabled libfreetype && require_pkg_config freetype2 "ft2build.h freetype/freetype.h" FT_Init_FreeType enabled libfreetype && require_pkg_config freetype2 "ft2build.h freetype/freetype.h" FT_Init_FreeType
enabled libgsm && require libgsm gsm/gsm.h gsm_create -lgsm enabled libgsm && require libgsm gsm/gsm.h gsm_create -lgsm
...@@ -3572,7 +3566,6 @@ echo "libass enabled ${libass-no}" ...@@ -3572,7 +3566,6 @@ echo "libass enabled ${libass-no}"
echo "libcdio support ${libcdio-no}" echo "libcdio support ${libcdio-no}"
echo "libcelt enabled ${libcelt-no}" echo "libcelt enabled ${libcelt-no}"
echo "libdc1394 support ${libdc1394-no}" echo "libdc1394 support ${libdc1394-no}"
echo "libdirac enabled ${libdirac-no}"
echo "libfaac enabled ${libfaac-no}" echo "libfaac enabled ${libfaac-no}"
echo "libgsm enabled ${libgsm-no}" echo "libgsm enabled ${libgsm-no}"
echo "libmodplug enabled ${libmodplug-no}" echo "libmodplug enabled ${libmodplug-no}"
......
...@@ -482,7 +482,7 @@ following image formats are supported: ...@@ -482,7 +482,7 @@ following image formats are supported:
@item DFA @tab @tab X @item DFA @tab @tab X
@tab Codec used in Chronomaster game. @tab Codec used in Chronomaster game.
@item Dirac @tab E @tab X @item Dirac @tab E @tab X
@tab supported through external libdirac/libschroedinger libraries @tab supported through external library libschroedinger
@item Deluxe Paint Animation @tab @tab X @item Deluxe Paint Animation @tab @tab X
@item DNxHD @tab X @tab X @item DNxHD @tab X @tab X
@tab aka SMPTE VC3 @tab aka SMPTE VC3
......
...@@ -354,9 +354,8 @@ These library packages are only available from ...@@ -354,9 +354,8 @@ These library packages are only available from
@uref{http://sourceware.org/cygwinports/, Cygwin Ports}: @uref{http://sourceware.org/cygwinports/, Cygwin Ports}:
@example @example
yasm, libSDL-devel, libdirac-devel, libfaac-devel, libaacplus-devel, libgsm-devel, yasm, libSDL-devel, libfaac-devel, libaacplus-devel, libgsm-devel, libmp3lame-devel,
libmp3lame-devel, libschroedinger1.0-devel, speex-devel, libtheora-devel, libschroedinger1.0-devel, speex-devel, libtheora-devel, libxvidcore-devel
libxvidcore-devel
@end example @end example
The recommendation for libnut and x264 is to build them from source by The recommendation for libnut and x264 is to build them from source by
......
...@@ -634,7 +634,6 @@ OBJS-$(CONFIG_WTV_DEMUXER) += mpeg4audio.o mpegaudiodata.o ...@@ -634,7 +634,6 @@ OBJS-$(CONFIG_WTV_DEMUXER) += mpeg4audio.o mpegaudiodata.o
# external codec libraries # external codec libraries
OBJS-$(CONFIG_LIBAACPLUS_ENCODER) += libaacplus.o OBJS-$(CONFIG_LIBAACPLUS_ENCODER) += libaacplus.o
OBJS-$(CONFIG_LIBCELT_DECODER) += libcelt_dec.o OBJS-$(CONFIG_LIBCELT_DECODER) += libcelt_dec.o
OBJS-$(CONFIG_LIBDIRAC_DECODER) += libdiracdec.o
OBJS-$(CONFIG_LIBFAAC_ENCODER) += libfaac.o audio_frame_queue.o OBJS-$(CONFIG_LIBFAAC_ENCODER) += libfaac.o audio_frame_queue.o
OBJS-$(CONFIG_LIBGSM_DECODER) += libgsm.o OBJS-$(CONFIG_LIBGSM_DECODER) += libgsm.o
OBJS-$(CONFIG_LIBGSM_ENCODER) += libgsm.o OBJS-$(CONFIG_LIBGSM_ENCODER) += libgsm.o
...@@ -753,7 +752,6 @@ SKIPHEADERS += %_tablegen.h \ ...@@ -753,7 +752,6 @@ SKIPHEADERS += %_tablegen.h \
tableprint.h \ tableprint.h \
$(ARCH)/vp56_arith.h $(ARCH)/vp56_arith.h
SKIPHEADERS-$(CONFIG_DXVA2) += dxva2.h dxva2_internal.h SKIPHEADERS-$(CONFIG_DXVA2) += dxva2.h dxva2_internal.h
SKIPHEADERS-$(CONFIG_LIBDIRAC) += libdirac.h
SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER) += libschroedinger.h SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER) += libschroedinger.h
SKIPHEADERS-$(CONFIG_MPEG_XVMC_DECODER) += xvmc.h SKIPHEADERS-$(CONFIG_MPEG_XVMC_DECODER) += xvmc.h
SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_internal.h SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_internal.h
......
...@@ -403,7 +403,6 @@ void avcodec_register_all(void) ...@@ -403,7 +403,6 @@ void avcodec_register_all(void)
/* external libraries */ /* external libraries */
REGISTER_DECODER (LIBCELT, libcelt); REGISTER_DECODER (LIBCELT, libcelt);
REGISTER_DECODER (LIBDIRAC, libdirac);
REGISTER_ENCODER (LIBFAAC, libfaac); REGISTER_ENCODER (LIBFAAC, libfaac);
REGISTER_ENCDEC (LIBGSM, libgsm); REGISTER_ENCDEC (LIBGSM, libgsm);
REGISTER_ENCDEC (LIBGSM_MS, libgsm_ms); REGISTER_ENCDEC (LIBGSM_MS, libgsm_ms);
......
/*
* Copyright (c) 2008 BBC, Anuradha Suraparaju <asuraparaju at gmail dot com >
*
* This file is part of FFmpeg.
*
* 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.
*
* 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
*/
/**
* @file
* data structures common to libdirac encoder and decoder
*/
#ifndef AVCODEC_LIBDIRAC_H
#define AVCODEC_LIBDIRAC_H
#include "avcodec.h"
#include <libdirac_common/dirac_types.h>
/**
* Table providing a Dirac chroma format to FFmpeg pixel format mapping.
*/
static const struct {
enum PixelFormat ff_pix_fmt;
dirac_chroma_t dirac_pix_fmt;
} dirac_pixel_format_map[] = {
{ PIX_FMT_YUV420P, format420 },
{ PIX_FMT_YUV422P, format422 },
{ PIX_FMT_YUV444P, format444 },
};
#endif /* AVCODEC_LIBDIRAC_H */
/*
* Dirac decoder support via libdirac library
* Copyright (c) 2005 BBC, Andrew Kennedy <dirac at rd dot bbc dot co dot uk>
* Copyright (c) 2006-2008 BBC, Anuradha Suraparaju <asuraparaju at gmail dot com >
*
* This file is part of FFmpeg.
*
* 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.
*
* 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
*/
/**
* @file
* Dirac decoder support via libdirac library; more details about the Dirac
* project can be found at http://dirac.sourceforge.net/.
* The libdirac_decoder library implements Dirac specification version 2.2
* (http://dirac.sourceforge.net/specification.html).
*/
#include "libavutil/imgutils.h"
#include "libdirac.h"
#undef NDEBUG
#include <assert.h>
#include <libdirac_decoder/dirac_parser.h>
/** contains a single frame returned from Dirac */
typedef struct DiracDecoderParams {
/** decoder handle */
dirac_decoder_t* p_decoder;
/** buffer to hold decoded frame */
unsigned char* p_out_frame_buf;
} DiracDecoderParams;
/**
* returns FFmpeg chroma format
*/
static enum PixelFormat get_chroma_format(dirac_chroma_t dirac_pix_fmt)
{
int num_formats = sizeof(dirac_pixel_format_map) /
sizeof(dirac_pixel_format_map[0]);
int idx;
for (idx = 0; idx < num_formats; ++idx)
if (dirac_pixel_format_map[idx].dirac_pix_fmt == dirac_pix_fmt)
return dirac_pixel_format_map[idx].ff_pix_fmt;
return PIX_FMT_NONE;
}
static av_cold int libdirac_decode_init(AVCodecContext *avccontext)
{
DiracDecoderParams *p_dirac_params = avccontext->priv_data;
p_dirac_params->p_decoder = dirac_decoder_init(avccontext->debug);
if (!p_dirac_params->p_decoder)
return -1;
return 0;
}
static int libdirac_decode_frame(AVCodecContext *avccontext,
void *data, int *data_size,
AVPacket *avpkt)
{
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
DiracDecoderParams *p_dirac_params = avccontext->priv_data;
AVPicture *picture = data;
AVPicture pic;
int pict_size;
unsigned char *buffer[3];
*data_size = 0;
if (buf_size > 0) {
/* set data to decode into buffer */
dirac_buffer(p_dirac_params->p_decoder, buf, buf + buf_size);
if ((buf[4] & 0x08) == 0x08 && (buf[4] & 0x03))
avccontext->has_b_frames = 1;
}
while (1) {
/* parse data and process result */
DecoderState state = dirac_parse(p_dirac_params->p_decoder);
switch (state) {
case STATE_BUFFER:
return buf_size;
case STATE_SEQUENCE:
{
/* tell FFmpeg about sequence details */
dirac_sourceparams_t *src_params = &p_dirac_params->p_decoder->src_params;
if (av_image_check_size(src_params->width, src_params->height,
0, avccontext) < 0) {
av_log(avccontext, AV_LOG_ERROR, "Invalid dimensions (%dx%d)\n",
src_params->width, src_params->height);
avccontext->height = avccontext->width = 0;
return -1;
}
avccontext->height = src_params->height;
avccontext->width = src_params->width;
avccontext->pix_fmt = get_chroma_format(src_params->chroma);
if (avccontext->pix_fmt == PIX_FMT_NONE) {
av_log(avccontext, AV_LOG_ERROR,
"Dirac chroma format %d not supported currently\n",
src_params->chroma);
return -1;
}
avccontext->time_base.den = src_params->frame_rate.numerator;
avccontext->time_base.num = src_params->frame_rate.denominator;
/* calculate output dimensions */
avpicture_fill(&pic, NULL, avccontext->pix_fmt,
avccontext->width, avccontext->height);
pict_size = avpicture_get_size(avccontext->pix_fmt,
avccontext->width,
avccontext->height);
/* allocate output buffer */
if (!p_dirac_params->p_out_frame_buf)
p_dirac_params->p_out_frame_buf = av_malloc(pict_size);
buffer[0] = p_dirac_params->p_out_frame_buf;
buffer[1] = p_dirac_params->p_out_frame_buf +
pic.linesize[0] * avccontext->height;
buffer[2] = buffer[1] +
pic.linesize[1] * src_params->chroma_height;
/* tell Dirac about output destination */
dirac_set_buf(p_dirac_params->p_decoder, buffer, NULL);
break;
}
case STATE_SEQUENCE_END:
break;
case STATE_PICTURE_AVAIL:
/* fill picture with current buffer data from Dirac */
avpicture_fill(picture, p_dirac_params->p_out_frame_buf,
avccontext->pix_fmt,
avccontext->width, avccontext->height);
*data_size = sizeof(AVPicture);
return buf_size;
case STATE_INVALID:
return -1;
default:
break;
}
}
return buf_size;
}
static av_cold int libdirac_decode_close(AVCodecContext *avccontext)
{
DiracDecoderParams *p_dirac_params = avccontext->priv_data;
dirac_decoder_close(p_dirac_params->p_decoder);
av_freep(&p_dirac_params->p_out_frame_buf);
return 0;
}
static void libdirac_flush(AVCodecContext *avccontext)
{
/* Got a seek request. We will need free memory held in the private
* context and free the current Dirac decoder handle and then open
* a new decoder handle. */
libdirac_decode_close(avccontext);
libdirac_decode_init(avccontext);
return;
}
AVCodec ff_libdirac_decoder = {
.name = "libdirac",
.type = AVMEDIA_TYPE_VIDEO,
.id = CODEC_ID_DIRAC,
.priv_data_size = sizeof(DiracDecoderParams),
.init = libdirac_decode_init,
.close = libdirac_decode_close,
.decode = libdirac_decode_frame,
.capabilities = CODEC_CAP_DELAY,
.flush = libdirac_flush,
.long_name = NULL_IF_CONFIG_SMALL("libdirac Dirac 2.2"),
};
...@@ -150,7 +150,7 @@ static int au_read_header(AVFormatContext *s) ...@@ -150,7 +150,7 @@ static int au_read_header(AVFormatContext *s)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if (channels <= 0) { if (channels == 0 || channels > 64) {
av_log(s, AV_LOG_ERROR, "Invalid number of channels %d\n", channels); av_log(s, AV_LOG_ERROR, "Invalid number of channels %d\n", channels);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
......
...@@ -223,6 +223,11 @@ typedef struct { ...@@ -223,6 +223,11 @@ typedef struct {
uint64_t length; uint64_t length;
} MatroskaLevel; } MatroskaLevel;
typedef struct {
uint64_t timecode;
EbmlList blocks;
} MatroskaCluster;
typedef struct { typedef struct {
AVFormatContext *ctx; AVFormatContext *ctx;
...@@ -259,6 +264,13 @@ typedef struct { ...@@ -259,6 +264,13 @@ typedef struct {
/* File has a CUES element, but we defer parsing until it is needed. */ /* File has a CUES element, but we defer parsing until it is needed. */
int cues_parsing_deferred; int cues_parsing_deferred;
int current_cluster_num_blocks;
int64_t current_cluster_pos;
MatroskaCluster current_cluster;
/* File has SSA subtitles which prevent incremental cluster parsing. */
int contains_ssa;
} MatroskaDemuxContext; } MatroskaDemuxContext;
typedef struct { typedef struct {
...@@ -268,11 +280,6 @@ typedef struct { ...@@ -268,11 +280,6 @@ typedef struct {
EbmlBin bin; EbmlBin bin;
} MatroskaBlock; } MatroskaBlock;
typedef struct {
uint64_t timecode;
EbmlList blocks;
} MatroskaCluster;
static EbmlSyntax ebml_header[] = { static EbmlSyntax ebml_header[] = {
{ EBML_ID_EBMLREADVERSION, EBML_UINT, 0, offsetof(Ebml,version), {.u=EBML_VERSION} }, { EBML_ID_EBMLREADVERSION, EBML_UINT, 0, offsetof(Ebml,version), {.u=EBML_VERSION} },
{ EBML_ID_EBMLMAXSIZELENGTH, EBML_UINT, 0, offsetof(Ebml,max_size), {.u=8} }, { EBML_ID_EBMLMAXSIZELENGTH, EBML_UINT, 0, offsetof(Ebml,max_size), {.u=8} },
...@@ -543,6 +550,38 @@ static EbmlSyntax matroska_clusters[] = { ...@@ -543,6 +550,38 @@ static EbmlSyntax matroska_clusters[] = {
{ 0 } { 0 }
}; };
static EbmlSyntax matroska_cluster_incremental_parsing[] = {
{ MATROSKA_ID_CLUSTERTIMECODE,EBML_UINT,0, offsetof(MatroskaCluster,timecode) },
{ MATROSKA_ID_BLOCKGROUP, EBML_NEST, sizeof(MatroskaBlock), offsetof(MatroskaCluster,blocks), {.n=matroska_blockgroup} },
{ MATROSKA_ID_SIMPLEBLOCK, EBML_PASS, sizeof(MatroskaBlock), offsetof(MatroskaCluster,blocks), {.n=matroska_blockgroup} },
{ MATROSKA_ID_CLUSTERPOSITION,EBML_NONE },
{ MATROSKA_ID_CLUSTERPREVSIZE,EBML_NONE },
{ MATROSKA_ID_INFO, EBML_NONE },
{ MATROSKA_ID_CUES, EBML_NONE },
{ MATROSKA_ID_TAGS, EBML_NONE },
{ MATROSKA_ID_SEEKHEAD, EBML_NONE },
{ MATROSKA_ID_CLUSTER, EBML_STOP },
{ 0 }
};
static EbmlSyntax matroska_cluster_incremental[] = {
{ MATROSKA_ID_CLUSTERTIMECODE,EBML_UINT,0, offsetof(MatroskaCluster,timecode) },
{ MATROSKA_ID_BLOCKGROUP, EBML_STOP },
{ MATROSKA_ID_SIMPLEBLOCK, EBML_STOP },
{ MATROSKA_ID_CLUSTERPOSITION,EBML_NONE },
{ MATROSKA_ID_CLUSTERPREVSIZE,EBML_NONE },
{ 0 }
};
static EbmlSyntax matroska_clusters_incremental[] = {
{ MATROSKA_ID_CLUSTER, EBML_NEST, 0, 0, {.n=matroska_cluster_incremental} },
{ MATROSKA_ID_INFO, EBML_NONE },
{ MATROSKA_ID_CUES, EBML_NONE },
{ MATROSKA_ID_TAGS, EBML_NONE },
{ MATROSKA_ID_SEEKHEAD, EBML_NONE },
{ 0 }
};
static const char *const matroska_doctypes[] = { "matroska", "webm" }; static const char *const matroska_doctypes[] = { "matroska", "webm" };
static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos) static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
...@@ -1693,6 +1732,8 @@ static int matroska_read_header(AVFormatContext *s) ...@@ -1693,6 +1732,8 @@ static int matroska_read_header(AVFormatContext *s)
st->need_parsing = AVSTREAM_PARSE_HEADERS; st->need_parsing = AVSTREAM_PARSE_HEADERS;
} else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) { } else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) {
st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE; st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
if (st->codec->codec_id == CODEC_ID_SSA)
matroska->contains_ssa = 1;
} }
} }
...@@ -1766,6 +1807,7 @@ static int matroska_deliver_packet(MatroskaDemuxContext *matroska, ...@@ -1766,6 +1807,7 @@ static int matroska_deliver_packet(MatroskaDemuxContext *matroska,
matroska->packets = newpackets; matroska->packets = newpackets;
} else { } else {
av_freep(&matroska->packets); av_freep(&matroska->packets);
matroska->prev_pkt = NULL;
} }
matroska->num_packets--; matroska->num_packets--;
return 0; return 0;
...@@ -1822,6 +1864,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, ...@@ -1822,6 +1864,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
st = track->stream; st = track->stream;
if (st->discard >= AVDISCARD_ALL) if (st->discard >= AVDISCARD_ALL)
return res; return res;
av_assert1(duration != AV_NOPTS_VALUE);
if (!duration) if (!duration)
duration = track->default_duration / matroska->time_scale; duration = track->default_duration / matroska->time_scale;
...@@ -2066,13 +2109,71 @@ end: ...@@ -2066,13 +2109,71 @@ end:
return res; return res;
} }
static int matroska_parse_cluster_incremental(MatroskaDemuxContext *matroska)
{
EbmlList *blocks_list;
MatroskaBlock *blocks;
int i, res;
res = ebml_parse(matroska,
matroska_cluster_incremental_parsing,
&matroska->current_cluster);
if (res == 1) {
/* New Cluster */
if (matroska->current_cluster_pos)
ebml_level_end(matroska);
ebml_free(matroska_cluster, &matroska->current_cluster);
memset(&matroska->current_cluster, 0, sizeof(MatroskaCluster));
matroska->current_cluster_num_blocks = 0;
matroska->current_cluster_pos = avio_tell(matroska->ctx->pb);
matroska->prev_pkt = NULL;
/* sizeof the ID which was already read */
if (matroska->current_id)
matroska->current_cluster_pos -= 4;
res = ebml_parse(matroska,
matroska_clusters_incremental,
&matroska->current_cluster);
/* Try parsing the block again. */
if (res == 1)
res = ebml_parse(matroska,
matroska_cluster_incremental_parsing,
&matroska->current_cluster);
}
if (!res &&
matroska->current_cluster_num_blocks <
matroska->current_cluster.blocks.nb_elem) {
blocks_list = &matroska->current_cluster.blocks;
blocks = blocks_list->elem;
matroska->current_cluster_num_blocks = blocks_list->nb_elem;
i = blocks_list->nb_elem - 1;
if (blocks[i].bin.size > 0 && blocks[i].bin.data) {
int is_keyframe = blocks[i].non_simple ? !blocks[i].reference : -1;
if (!blocks[i].non_simple)
blocks[i].duration = 0;
res = matroska_parse_block(matroska,
blocks[i].bin.data, blocks[i].bin.size,
blocks[i].bin.pos,
matroska->current_cluster.timecode,
blocks[i].duration, is_keyframe,
matroska->current_cluster_pos);
}
}
if (res < 0) matroska->done = 1;
return res;
}
static int matroska_parse_cluster(MatroskaDemuxContext *matroska) static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
{ {
MatroskaCluster cluster = { 0 }; MatroskaCluster cluster = { 0 };
EbmlList *blocks_list; EbmlList *blocks_list;
MatroskaBlock *blocks; MatroskaBlock *blocks;
int i, res; int i, res;
int64_t pos = avio_tell(matroska->ctx->pb); int64_t pos;
if (!matroska->contains_ssa)
return matroska_parse_cluster_incremental(matroska);
pos = avio_tell(matroska->ctx->pb);
matroska->prev_pkt = NULL; matroska->prev_pkt = NULL;
if (matroska->current_id) if (matroska->current_id)
pos -= 4; /* sizeof the ID which was already read */ pos -= 4; /* sizeof the ID which was already read */
...@@ -2129,6 +2230,7 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index, ...@@ -2129,6 +2230,7 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index,
avio_seek(s->pb, st->index_entries[st->nb_index_entries-1].pos, SEEK_SET); avio_seek(s->pb, st->index_entries[st->nb_index_entries-1].pos, SEEK_SET);
matroska->current_id = 0; matroska->current_id = 0;
while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) { while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) {
matroska->prev_pkt = NULL;
matroska_clear_queue(matroska); matroska_clear_queue(matroska);
if (matroska_parse_cluster(matroska) < 0) if (matroska_parse_cluster(matroska) < 0)
break; break;
...@@ -2187,6 +2289,7 @@ static int matroska_read_close(AVFormatContext *s) ...@@ -2187,6 +2289,7 @@ static int matroska_read_close(AVFormatContext *s)
for (n=0; n < matroska->tracks.nb_elem; n++) for (n=0; n < matroska->tracks.nb_elem; n++)
if (tracks[n].type == MATROSKA_TRACK_TYPE_AUDIO) if (tracks[n].type == MATROSKA_TRACK_TYPE_AUDIO)
av_free(tracks[n].audio.buf); av_free(tracks[n].audio.buf);
ebml_free(matroska_cluster, &matroska->current_cluster);
ebml_free(matroska_segment, matroska); ebml_free(matroska_segment, matroska);
return 0; return 0;
......
...@@ -133,8 +133,10 @@ int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, ...@@ -133,8 +133,10 @@ int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples,
return AVERROR(EINVAL); return AVERROR(EINVAL);
/* auto-select alignment if not specified */ /* auto-select alignment if not specified */
if (!align) if (!align) {
align = 32; align = 1;
nb_samples = FFALIGN(nb_samples, 32);
}
/* check for integer overflow */ /* check for integer overflow */
if (nb_channels > INT_MAX / align || if (nb_channels > INT_MAX / align ||
......
...@@ -36,15 +36,15 @@ ...@@ -36,15 +36,15 @@
#include "swscale_internal.h" #include "swscale_internal.h"
#define RGB2YUV_SHIFT 15 #define RGB2YUV_SHIFT 15
#define BY ( (int)(0.114*219/255*(1<<RGB2YUV_SHIFT)+0.5)) #define BY ((int)(0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define BV (-(int)(0.081*224/255*(1<<RGB2YUV_SHIFT)+0.5)) #define BV (-(int)(0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define BU ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5)) #define BU ((int)(0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define GY ( (int)(0.587*219/255*(1<<RGB2YUV_SHIFT)+0.5)) #define GY ((int)(0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define GV (-(int)(0.419*224/255*(1<<RGB2YUV_SHIFT)+0.5)) #define GV (-(int)(0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define GU (-(int)(0.331*224/255*(1<<RGB2YUV_SHIFT)+0.5)) #define GU (-(int)(0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define RY ( (int)(0.299*219/255*(1<<RGB2YUV_SHIFT)+0.5)) #define RY ((int)(0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define RV ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5)) #define RV ((int)(0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define RU (-(int)(0.169*224/255*(1<<RGB2YUV_SHIFT)+0.5)) #define RU (-(int)(0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos)) #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
...@@ -131,51 +131,58 @@ static void pattern ## 64 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV ...@@ -131,51 +131,58 @@ static void pattern ## 64 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV
rgb64funcs(rgb, LE, PIX_FMT_RGBA64LE) rgb64funcs(rgb, LE, PIX_FMT_RGBA64LE)
rgb64funcs(rgb, BE, PIX_FMT_RGBA64BE) rgb64funcs(rgb, BE, PIX_FMT_RGBA64BE)
static av_always_inline void static av_always_inline void rgb48ToY_c_template(uint16_t *dst,
rgb48ToY_c_template(uint16_t *dst, const uint16_t *src, int width, const uint16_t *src, int width,
enum PixelFormat origin) enum PixelFormat origin)
{ {
int i; int i;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
unsigned int r_b = input_pixel(&src[i*3+0]); unsigned int r_b = input_pixel(&src[i * 3 + 0]);
unsigned int g = input_pixel(&src[i*3+1]); unsigned int g = input_pixel(&src[i * 3 + 1]);
unsigned int b_r = input_pixel(&src[i*3+2]); unsigned int b_r = input_pixel(&src[i * 3 + 2]);
dst[i] = (RY*r + GY*g + BY*b + (0x2001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT; dst[i] = (RY * r + GY * g + BY * b + (0x2001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
} }
} }
static av_always_inline void static av_always_inline void rgb48ToUV_c_template(uint16_t *dstU,
rgb48ToUV_c_template(uint16_t *dstU, uint16_t *dstV, uint16_t *dstV,
const uint16_t *src1, const uint16_t *src2, const uint16_t *src1,
int width, enum PixelFormat origin) const uint16_t *src2,
int width,
enum PixelFormat origin)
{ {
int i; int i;
assert(src1==src2); assert(src1 == src2);
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
int r_b = input_pixel(&src1[i*3+0]); int r_b = input_pixel(&src1[i * 3 + 0]);
int g = input_pixel(&src1[i*3+1]); int g = input_pixel(&src1[i * 3 + 1]);
int b_r = input_pixel(&src1[i*3+2]); int b_r = input_pixel(&src1[i * 3 + 2]);
dstU[i] = (RU*r + GU*g + BU*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT; dstU[i] = (RU * r + GU * g + BU * b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
dstV[i] = (RV*r + GV*g + BV*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT; dstV[i] = (RV * r + GV * g + BV * b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
} }
} }
static av_always_inline void static av_always_inline void rgb48ToUV_half_c_template(uint16_t *dstU,
rgb48ToUV_half_c_template(uint16_t *dstU, uint16_t *dstV, uint16_t *dstV,
const uint16_t *src1, const uint16_t *src2, const uint16_t *src1,
int width, enum PixelFormat origin) const uint16_t *src2,
int width,
enum PixelFormat origin)
{ {
int i; int i;
assert(src1==src2); assert(src1 == src2);
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
int r_b = (input_pixel(&src1[6 * i + 0]) + input_pixel(&src1[6 * i + 3]) + 1) >> 1; int r_b = (input_pixel(&src1[6 * i + 0]) +
int g = (input_pixel(&src1[6 * i + 1]) + input_pixel(&src1[6 * i + 4]) + 1) >> 1; input_pixel(&src1[6 * i + 3]) + 1) >> 1;
int b_r = (input_pixel(&src1[6 * i + 2]) + input_pixel(&src1[6 * i + 5]) + 1) >> 1; int g = (input_pixel(&src1[6 * i + 1]) +
input_pixel(&src1[6 * i + 4]) + 1) >> 1;
dstU[i]= (RU*r + GU*g + BU*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT; int b_r = (input_pixel(&src1[6 * i + 2]) +
dstV[i]= (RV*r + GV*g + BV*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT; input_pixel(&src1[6 * i + 5]) + 1) >> 1;
dstU[i] = (RU * r + GU * g + BU * b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
dstV[i] = (RV * r + GV * g + BV * b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
} }
} }
...@@ -183,33 +190,46 @@ rgb48ToUV_half_c_template(uint16_t *dstU, uint16_t *dstV, ...@@ -183,33 +190,46 @@ rgb48ToUV_half_c_template(uint16_t *dstU, uint16_t *dstV,
#undef b #undef b
#undef input_pixel #undef input_pixel
#define rgb48funcs(pattern, BE_LE, origin) \ #define rgb48funcs(pattern, BE_LE, origin) \
static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0, const uint8_t *unused1,\ static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *_dst, \
int width, uint32_t *unused) \ const uint8_t *_src, \
{ \ const uint8_t *unused0, const uint8_t *unused1,\
const uint16_t *src = (const uint16_t *) _src; \ int width, \
uint16_t *dst = (uint16_t *) _dst; \ uint32_t *unused) \
rgb48ToY_c_template(dst, src, width, origin); \ { \
} \ const uint16_t *src = (const uint16_t *)_src; \
\ uint16_t *dst = (uint16_t *)_dst; \
static void pattern ## 48 ## BE_LE ## ToUV_c(uint8_t *_dstU, uint8_t *_dstV, \ rgb48ToY_c_template(dst, src, width, origin); \
const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \ } \
int width, uint32_t *unused) \ \
{ \ static void pattern ## 48 ## BE_LE ## ToUV_c(uint8_t *_dstU, \
const uint16_t *src1 = (const uint16_t *) _src1, \ uint8_t *_dstV, \
*src2 = (const uint16_t *) _src2; \ const uint8_t *unused0, \
uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \ const uint8_t *_src1, \
rgb48ToUV_c_template(dstU, dstV, src1, src2, width, origin); \ const uint8_t *_src2, \
} \ int width, \
\ uint32_t *unused) \
static void pattern ## 48 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, \ { \
const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \ const uint16_t *src1 = (const uint16_t *)_src1, \
int width, uint32_t *unused) \ *src2 = (const uint16_t *)_src2; \
{ \ uint16_t *dstU = (uint16_t *)_dstU, \
const uint16_t *src1 = (const uint16_t *) _src1, \ *dstV = (uint16_t *)_dstV; \
*src2 = (const uint16_t *) _src2; \ rgb48ToUV_c_template(dstU, dstV, src1, src2, width, origin); \
uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \ } \
rgb48ToUV_half_c_template(dstU, dstV, src1, src2, width, origin); \ \
static void pattern ## 48 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, \
uint8_t *_dstV, \
const uint8_t *unused0, \
const uint8_t *_src1, \
const uint8_t *_src2, \
int width, \
uint32_t *unused) \
{ \
const uint16_t *src1 = (const uint16_t *)_src1, \
*src2 = (const uint16_t *)_src2; \
uint16_t *dstU = (uint16_t *)_dstU, \
*dstV = (uint16_t *)_dstV; \
rgb48ToUV_half_c_template(dstU, dstV, src1, src2, width, origin); \
} }
rgb48funcs(rgb, LE, PIX_FMT_RGB48LE) rgb48funcs(rgb, LE, PIX_FMT_RGB48LE)
...@@ -217,70 +237,85 @@ rgb48funcs(rgb, BE, PIX_FMT_RGB48BE) ...@@ -217,70 +237,85 @@ rgb48funcs(rgb, BE, PIX_FMT_RGB48BE)
rgb48funcs(bgr, LE, PIX_FMT_BGR48LE) rgb48funcs(bgr, LE, PIX_FMT_BGR48LE)
rgb48funcs(bgr, BE, PIX_FMT_BGR48BE) rgb48funcs(bgr, BE, PIX_FMT_BGR48BE)
#define input_pixel(i) ((origin == PIX_FMT_RGBA || origin == PIX_FMT_BGRA || \ #define input_pixel(i) ((origin == PIX_FMT_RGBA || \
origin == PIX_FMT_ARGB || origin == PIX_FMT_ABGR) ? AV_RN32A(&src[(i)*4]) : \ origin == PIX_FMT_BGRA || \
(isBE(origin) ? AV_RB16(&src[(i)*2]) : AV_RL16(&src[(i)*2]))) origin == PIX_FMT_ARGB || \
origin == PIX_FMT_ABGR) \
static av_always_inline void ? AV_RN32A(&src[(i) * 4]) \
rgb16_32ToY_c_template(int16_t *dst, const uint8_t *src, : (isBE(origin) ? AV_RB16(&src[(i) * 2]) \
int width, enum PixelFormat origin, : AV_RL16(&src[(i) * 2])))
int shr, int shg, int shb, int shp,
int maskr, int maskg, int maskb, static av_always_inline void rgb16_32ToY_c_template(int16_t *dst,
int rsh, int gsh, int bsh, int S) const uint8_t *src,
int width,
enum PixelFormat origin,
int shr, int shg,
int shb, int shp,
int maskr, int maskg,
int maskb, int rsh,
int gsh, int bsh, int S)
{ {
const int ry = RY << rsh, gy = GY << gsh, by = BY << bsh; const int ry = RY << rsh, gy = GY << gsh, by = BY << bsh;
const unsigned rnd = (32<<((S)-1)) + (1<<(S-7)); const unsigned rnd = (32<<((S)-1)) + (1<<(S-7));
int i; int i;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
int px = input_pixel(i) >> shp; int px = input_pixel(i) >> shp;
int b = (px & maskb) >> shb; int b = (px & maskb) >> shb;
int g = (px & maskg) >> shg; int g = (px & maskg) >> shg;
int r = (px & maskr) >> shr; int r = (px & maskr) >> shr;
dst[i] = (ry * r + gy * g + by * b + rnd) >> ((S)-6); dst[i] = (ry * r + gy * g + by * b + rnd) >> ((S)-6);
} }
} }
static av_always_inline void static av_always_inline void rgb16_32ToUV_c_template(int16_t *dstU,
rgb16_32ToUV_c_template(int16_t *dstU, int16_t *dstV, int16_t *dstV,
const uint8_t *src, int width, const uint8_t *src,
enum PixelFormat origin, int width,
int shr, int shg, int shb, int shp, enum PixelFormat origin,
int maskr, int maskg, int maskb, int shr, int shg,
int rsh, int gsh, int bsh, int S) int shb, int shp,
{ int maskr, int maskg,
const int ru = RU << rsh, gu = GU << gsh, bu = BU << bsh, int maskb, int rsh,
rv = RV << rsh, gv = GV << gsh, bv = BV << bsh; int gsh, int bsh, int S)
{
const int ru = RU << rsh, gu = GU << gsh, bu = BU << bsh,
rv = RV << rsh, gv = GV << gsh, bv = BV << bsh;
const unsigned rnd = (256u<<((S)-1)) + (1<<(S-7)); const unsigned rnd = (256u<<((S)-1)) + (1<<(S-7));
int i; int i;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
int px = input_pixel(i) >> shp; int px = input_pixel(i) >> shp;
int b = (px & maskb) >> shb; int b = (px & maskb) >> shb;
int g = (px & maskg) >> shg; int g = (px & maskg) >> shg;
int r = (px & maskr) >> shr; int r = (px & maskr) >> shr;
dstU[i] = (ru * r + gu * g + bu * b + rnd) >> ((S)-6); dstU[i] = (ru * r + gu * g + bu * b + rnd) >> ((S)-6);
dstV[i] = (rv * r + gv * g + bv * b + rnd) >> ((S)-6); dstV[i] = (rv * r + gv * g + bv * b + rnd) >> ((S)-6);
} }
} }
static av_always_inline void static av_always_inline void rgb16_32ToUV_half_c_template(int16_t *dstU,
rgb16_32ToUV_half_c_template(int16_t *dstU, int16_t *dstV, int16_t *dstV,
const uint8_t *src, int width, const uint8_t *src,
enum PixelFormat origin, int width,
int shr, int shg, int shb, int shp, enum PixelFormat origin,
int maskr, int maskg, int maskb, int shr, int shg,
int rsh, int gsh, int bsh, int S) int shb, int shp,
{ int maskr, int maskg,
const int ru = RU << rsh, gu = GU << gsh, bu = BU << bsh, int maskb, int rsh,
rv = RV << rsh, gv = GV << gsh, bv = BV << bsh, int gsh, int bsh, int S)
maskgx = ~(maskr | maskb); {
const int ru = RU << rsh, gu = GU << gsh, bu = BU << bsh,
rv = RV << rsh, gv = GV << gsh, bv = BV << bsh,
maskgx = ~(maskr | maskb);
const unsigned rnd = (256U<<(S)) + (1<<(S-6)); const unsigned rnd = (256U<<(S)) + (1<<(S-6));
int i; int i;
maskr |= maskr << 1; maskb |= maskb << 1; maskg |= maskg << 1; maskr |= maskr << 1;
maskb |= maskb << 1;
maskg |= maskg << 1;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
int px0 = input_pixel(2 * i + 0) >> shp; int px0 = input_pixel(2 * i + 0) >> shp;
int px1 = input_pixel(2 * i + 1) >> shp; int px1 = input_pixel(2 * i + 1) >> shp;
...@@ -288,11 +323,12 @@ rgb16_32ToUV_half_c_template(int16_t *dstU, int16_t *dstV, ...@@ -288,11 +323,12 @@ rgb16_32ToUV_half_c_template(int16_t *dstU, int16_t *dstV,
int rb = px0 + px1 - g; int rb = px0 + px1 - g;
b = (rb & maskb) >> shb; b = (rb & maskb) >> shb;
if (shp || origin == PIX_FMT_BGR565LE || origin == PIX_FMT_BGR565BE || if (shp ||
origin == PIX_FMT_BGR565LE || origin == PIX_FMT_BGR565BE ||
origin == PIX_FMT_RGB565LE || origin == PIX_FMT_RGB565BE) { origin == PIX_FMT_RGB565LE || origin == PIX_FMT_RGB565BE) {
g >>= shg; g >>= shg;
} else { } else {
g = (g & maskg) >> shg; g = (g & maskg) >> shg;
} }
r = (rb & maskr) >> shr; r = (rb & maskr) >> shr;
...@@ -303,57 +339,58 @@ rgb16_32ToUV_half_c_template(int16_t *dstU, int16_t *dstV, ...@@ -303,57 +339,58 @@ rgb16_32ToUV_half_c_template(int16_t *dstU, int16_t *dstV,
#undef input_pixel #undef input_pixel
#define rgb16_32_wrapper(fmt, name, shr, shg, shb, shp, maskr, \ #define rgb16_32_wrapper(fmt, name, shr, shg, shb, shp, maskr, \
maskg, maskb, rsh, gsh, bsh, S) \ maskg, maskb, rsh, gsh, bsh, S) \
static void name ## ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, \ static void name ## ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, \
int width, uint32_t *unused) \ int width, uint32_t *unused) \
{ \ { \
rgb16_32ToY_c_template((int16_t*)dst, src, width, fmt, \ rgb16_32ToY_c_template((int16_t*)dst, src, width, fmt, shr, shg, shb, shp, \
shr, shg, shb, shp, \ maskr, maskg, maskb, rsh, gsh, bsh, S); \
maskr, maskg, maskb, rsh, gsh, bsh, S); \ } \
} \ \
\ static void name ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \
static void name ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \ const uint8_t *unused0, const uint8_t *src, const uint8_t *dummy, \
const uint8_t *unused0, const uint8_t *src, const uint8_t *dummy, \ int width, uint32_t *unused) \
int width, uint32_t *unused) \ { \
{ \ rgb16_32ToUV_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt, \
rgb16_32ToUV_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt, \ shr, shg, shb, shp, \
shr, shg, shb, shp, \ maskr, maskg, maskb, rsh, gsh, bsh, S); \
maskr, maskg, maskb, rsh, gsh, bsh, S); \ } \
} \ \
\ static void name ## ToUV_half_c(uint8_t *dstU, uint8_t *dstV, \
static void name ## ToUV_half_c(uint8_t *dstU, uint8_t *dstV, \ const uint8_t *unused0, const uint8_t *src, \
const uint8_t *unused0, const uint8_t *src, const uint8_t *dummy, \ const uint8_t *dummy, \
int width, uint32_t *unused) \ int width, uint32_t *unused) \
{ \ { \
rgb16_32ToUV_half_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt, \ rgb16_32ToUV_half_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt, \
shr, shg, shb, shp, \ shr, shg, shb, shp, \
maskr, maskg, maskb, rsh, gsh, bsh, S); \ maskr, maskg, maskb, \
} rsh, gsh, bsh, S); \
}
rgb16_32_wrapper(PIX_FMT_BGR32, bgr32, 16, 0, 0, 0, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8, RGB2YUV_SHIFT+8)
rgb16_32_wrapper(PIX_FMT_BGR32_1, bgr321, 16, 0, 0, 8, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8, RGB2YUV_SHIFT+8) rgb16_32_wrapper(PIX_FMT_BGR32, bgr32, 16, 0, 0, 0, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8, RGB2YUV_SHIFT + 8)
rgb16_32_wrapper(PIX_FMT_RGB32, rgb32, 0, 0, 16, 0, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8, RGB2YUV_SHIFT+8) rgb16_32_wrapper(PIX_FMT_BGR32_1, bgr321, 16, 0, 0, 8, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8, RGB2YUV_SHIFT + 8)
rgb16_32_wrapper(PIX_FMT_RGB32_1, rgb321, 0, 0, 16, 8, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8, RGB2YUV_SHIFT+8) rgb16_32_wrapper(PIX_FMT_RGB32, rgb32, 0, 0, 16, 0, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8, RGB2YUV_SHIFT + 8)
rgb16_32_wrapper(PIX_FMT_BGR565LE, bgr16le, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0, RGB2YUV_SHIFT+8) rgb16_32_wrapper(PIX_FMT_RGB32_1, rgb321, 0, 0, 16, 8, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8, RGB2YUV_SHIFT + 8)
rgb16_32_wrapper(PIX_FMT_BGR555LE, bgr15le, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0, RGB2YUV_SHIFT+7) rgb16_32_wrapper(PIX_FMT_BGR565LE, bgr16le, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0, RGB2YUV_SHIFT + 8)
rgb16_32_wrapper(PIX_FMT_BGR444LE, bgr12le, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0, RGB2YUV_SHIFT+4) rgb16_32_wrapper(PIX_FMT_BGR555LE, bgr15le, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0, RGB2YUV_SHIFT + 7)
rgb16_32_wrapper(PIX_FMT_RGB565LE, rgb16le, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT+8) rgb16_32_wrapper(PIX_FMT_BGR444LE, bgr12le, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0, RGB2YUV_SHIFT + 4)
rgb16_32_wrapper(PIX_FMT_RGB555LE, rgb15le, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT+7) rgb16_32_wrapper(PIX_FMT_RGB565LE, rgb16le, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT + 8)
rgb16_32_wrapper(PIX_FMT_RGB444LE, rgb12le, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT+4) rgb16_32_wrapper(PIX_FMT_RGB555LE, rgb15le, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT + 7)
rgb16_32_wrapper(PIX_FMT_BGR565BE, bgr16be, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0, RGB2YUV_SHIFT+8) rgb16_32_wrapper(PIX_FMT_RGB444LE, rgb12le, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT + 4)
rgb16_32_wrapper(PIX_FMT_BGR555BE, bgr15be, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0, RGB2YUV_SHIFT+7) rgb16_32_wrapper(PIX_FMT_BGR565BE, bgr16be, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0, RGB2YUV_SHIFT + 8)
rgb16_32_wrapper(PIX_FMT_BGR444BE, bgr12be, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0, RGB2YUV_SHIFT+4) rgb16_32_wrapper(PIX_FMT_BGR555BE, bgr15be, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0, RGB2YUV_SHIFT + 7)
rgb16_32_wrapper(PIX_FMT_RGB565BE, rgb16be, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT+8) rgb16_32_wrapper(PIX_FMT_BGR444BE, bgr12be, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0, RGB2YUV_SHIFT + 4)
rgb16_32_wrapper(PIX_FMT_RGB555BE, rgb15be, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT+7) rgb16_32_wrapper(PIX_FMT_RGB565BE, rgb16be, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT + 8)
rgb16_32_wrapper(PIX_FMT_RGB444BE, rgb12be, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT+4) rgb16_32_wrapper(PIX_FMT_RGB555BE, rgb15be, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT + 7)
rgb16_32_wrapper(PIX_FMT_RGB444BE, rgb12be, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT + 4)
static void gbr24pToUV_half_c(uint16_t *dstU, uint16_t *dstV, static void gbr24pToUV_half_c(uint16_t *dstU, uint16_t *dstV,
const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc, const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc,
int width, enum PixelFormat origin) int width, enum PixelFormat origin)
{ {
int i; int i;
for (i=0; i<width; i++) { for (i = 0; i < width; i++) {
unsigned int g = gsrc[2*i] + gsrc[2*i+1]; unsigned int g = gsrc[2*i] + gsrc[2*i+1];
unsigned int b = bsrc[2*i] + bsrc[2*i+1]; unsigned int b = bsrc[2*i] + bsrc[2*i+1];
unsigned int r = rsrc[2*i] + rsrc[2*i+1]; unsigned int r = rsrc[2*i] + rsrc[2*i+1];
...@@ -367,9 +404,8 @@ static void rgba64ToA_c(int16_t *dst, const uint16_t *src, const uint8_t *unused ...@@ -367,9 +404,8 @@ static void rgba64ToA_c(int16_t *dst, const uint16_t *src, const uint8_t *unused
const uint8_t *unused2, int width, uint32_t *unused) const uint8_t *unused2, int width, uint32_t *unused)
{ {
int i; int i;
for (i=0; i<width; i++) { for (i = 0; i < width; i++)
dst[i]= src[4*i+3]; dst[i] = src[4 * i + 3];
}
} }
static void abgrToA_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused) static void abgrToA_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
...@@ -401,10 +437,10 @@ static void palToA_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, c ...@@ -401,10 +437,10 @@ static void palToA_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, c
static void palToY_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, long width, uint32_t *pal) static void palToY_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, long width, uint32_t *pal)
{ {
int i; int i;
for (i=0; i<width; i++) { for (i = 0; i < width; i++) {
int d= src[i]; int d = src[i];
dst[i]= (pal[d] & 0xFF)<<6; dst[i] = (pal[d] & 0xFF)<<6;
} }
} }
...@@ -414,11 +450,11 @@ static void palToUV_c(uint16_t *dstU, int16_t *dstV, ...@@ -414,11 +450,11 @@ static void palToUV_c(uint16_t *dstU, int16_t *dstV,
{ {
int i; int i;
assert(src1 == src2); assert(src1 == src2);
for (i=0; i<width; i++) { for (i = 0; i < width; i++) {
int p= pal[src1[i]]; int p = pal[src1[i]];
dstU[i]= (uint8_t)(p>> 8)<<6; dstU[i] = (uint8_t)(p>> 8)<<6;
dstV[i]= (uint8_t)(p>>16)<<6; dstV[i] = (uint8_t)(p>>16)<<6;
} }
} }
...@@ -427,14 +463,14 @@ static void monowhite2Y_c(int16_t *dst, const uint8_t *src, const uint8_t *unuse ...@@ -427,14 +463,14 @@ static void monowhite2Y_c(int16_t *dst, const uint8_t *src, const uint8_t *unuse
int i, j; int i, j;
width = (width + 7) >> 3; width = (width + 7) >> 3;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
int d= ~src[i]; int d = ~src[i];
for(j=0; j<8; j++) for (j = 0; j < 8; j++)
dst[8*i+j]= ((d>>(7-j))&1)*16383; dst[8*i+j]= ((d>>(7-j))&1) * 16383;
} }
if(width&7){ if(width&7){
int d= ~src[i]; int d= ~src[i];
for(j=0; j<(width&7); j++) for (j = 0; j < (width&7); j++)
dst[8*i+j]= ((d>>(7-j))&1)*16383; dst[8*i+j]= ((d>>(7-j))&1) * 16383;
} }
} }
...@@ -443,14 +479,14 @@ static void monoblack2Y_c(int16_t *dst, const uint8_t *src, const uint8_t *unuse ...@@ -443,14 +479,14 @@ static void monoblack2Y_c(int16_t *dst, const uint8_t *src, const uint8_t *unuse
int i, j; int i, j;
width = (width + 7) >> 3; width = (width + 7) >> 3;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
int d= src[i]; int d = src[i];
for(j=0; j<8; j++) for (j = 0; j < 8; j++)
dst[8*i+j]= ((d>>(7-j))&1)*16383; dst[8*i+j]= ((d>>(7-j))&1) * 16383;
} }
if(width&7){ if(width&7){
int d= src[i]; int d = src[i];
for(j=0; j<(width&7); j++) for (j = 0; j < (width&7); j++)
dst[8*i+j]= ((d>>(7-j))&1)*16383; dst[8*i+j] = ((d>>(7-j))&1) * 16383;
} }
} }
...@@ -458,61 +494,61 @@ static void yuy2ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, ...@@ -458,61 +494,61 @@ static void yuy2ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1,
uint32_t *unused) uint32_t *unused)
{ {
int i; int i;
for (i=0; i<width; i++) for (i = 0; i < width; i++)
dst[i]= src[2*i]; dst[i] = src[2 * i];
} }
static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1, static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
const uint8_t *src2, int width, uint32_t *unused) const uint8_t *src2, int width, uint32_t *unused)
{ {
int i; int i;
for (i=0; i<width; i++) { for (i = 0; i < width; i++) {
dstU[i]= src1[4*i + 1]; dstU[i] = src1[4 * i + 1];
dstV[i]= src1[4*i + 3]; dstV[i] = src1[4 * i + 3];
} }
assert(src1 == src2); assert(src1 == src2);
} }
static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused) static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, const uint8_t *unused2, int width,
uint32_t *unused)
{ {
int i; int i;
const uint16_t *src = (const uint16_t *) _src; const uint16_t *src = (const uint16_t *)_src;
uint16_t *dst = (uint16_t *) _dst; uint16_t *dst = (uint16_t *)_dst;
for (i=0; i<width; i++) { for (i = 0; i < width; i++)
dst[i] = av_bswap16(src[i]); dst[i] = av_bswap16(src[i]);
}
} }
static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *_src1, static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *_src1,
const uint8_t *_src2, int width, uint32_t *unused) const uint8_t *_src2, int width, uint32_t *unused)
{ {
int i; int i;
const uint16_t *src1 = (const uint16_t *) _src1, const uint16_t *src1 = (const uint16_t *)_src1,
*src2 = (const uint16_t *) _src2; *src2 = (const uint16_t *)_src2;
uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; uint16_t *dstU = (uint16_t *)_dstU, *dstV = (uint16_t *)_dstV;
for (i=0; i<width; i++) { for (i = 0; i < width; i++) {
dstU[i] = av_bswap16(src1[i]); dstU[i] = av_bswap16(src1[i]);
dstV[i] = av_bswap16(src2[i]); dstV[i] = av_bswap16(src2[i]);
} }
} }
/* This is almost identical to the previous, end exists only because /* This is almost identical to the previous, end exists only because
* yuy2ToY/UV)(dst, src+1, ...) would have 100% unaligned accesses. */ * yuy2ToY/UV)(dst, src + 1, ...) would have 100% unaligned accesses. */
static void uyvyToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, static void uyvyToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
uint32_t *unused) uint32_t *unused)
{ {
int i; int i;
for (i=0; i<width; i++) for (i = 0; i < width; i++)
dst[i]= src[2*i+1]; dst[i] = src[2 * i + 1];
} }
static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1, static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
const uint8_t *src2, int width, uint32_t *unused) const uint8_t *src2, int width, uint32_t *unused)
{ {
int i; int i;
for (i=0; i<width; i++) { for (i = 0; i < width; i++) {
dstU[i]= src1[4*i + 0]; dstU[i] = src1[4 * i + 0];
dstV[i]= src1[4*i + 2]; dstV[i] = src1[4 * i + 2];
} }
assert(src1 == src2); assert(src1 == src2);
} }
...@@ -522,8 +558,8 @@ static av_always_inline void nvXXtoUV_c(uint8_t *dst1, uint8_t *dst2, ...@@ -522,8 +558,8 @@ static av_always_inline void nvXXtoUV_c(uint8_t *dst1, uint8_t *dst2,
{ {
int i; int i;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
dst1[i] = src[2*i+0]; dst1[i] = src[2 * i + 0];
dst2[i] = src[2*i+1]; dst2[i] = src[2 * i + 1];
} }
} }
...@@ -547,12 +583,12 @@ static void bgr24ToY_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, ...@@ -547,12 +583,12 @@ static void bgr24ToY_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1,
int width, uint32_t *unused) int width, uint32_t *unused)
{ {
int i; int i;
for (i=0; i<width; i++) { for (i = 0; i < width; i++) {
int b= src[i*3+0]; int b = src[i * 3 + 0];
int g= src[i*3+1]; int g = src[i * 3 + 1];
int r= src[i*3+2]; int r = src[i * 3 + 2];
dst[i]= ((RY*r + GY*g + BY*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6)); dst[i] = ((RY*r + GY*g + BY*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
} }
} }
...@@ -560,13 +596,13 @@ static void bgr24ToUV_c(int16_t *dstU, int16_t *dstV, const uint8_t *unused0, co ...@@ -560,13 +596,13 @@ static void bgr24ToUV_c(int16_t *dstU, int16_t *dstV, const uint8_t *unused0, co
const uint8_t *src2, int width, uint32_t *unused) const uint8_t *src2, int width, uint32_t *unused)
{ {
int i; int i;
for (i=0; i<width; i++) { for (i = 0; i < width; i++) {
int b= src1[3*i + 0]; int b = src1[3 * i + 0];
int g= src1[3*i + 1]; int g = src1[3 * i + 1];
int r= src1[3*i + 2]; int r = src1[3 * i + 2];
dstU[i]= (RU*r + GU*g + BU*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6); dstU[i] = (RU*r + GU*g + BU*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
dstV[i]= (RV*r + GV*g + BV*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6); dstV[i] = (RV*r + GV*g + BV*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
} }
assert(src1 == src2); assert(src1 == src2);
} }
...@@ -575,13 +611,13 @@ static void bgr24ToUV_half_c(int16_t *dstU, int16_t *dstV, const uint8_t *unused ...@@ -575,13 +611,13 @@ static void bgr24ToUV_half_c(int16_t *dstU, int16_t *dstV, const uint8_t *unused
const uint8_t *src2, int width, uint32_t *unused) const uint8_t *src2, int width, uint32_t *unused)
{ {
int i; int i;
for (i=0; i<width; i++) { for (i = 0; i < width; i++) {
int b= src1[6*i + 0] + src1[6*i + 3]; int b = src1[6 * i + 0] + src1[6 * i + 3];
int g= src1[6*i + 1] + src1[6*i + 4]; int g = src1[6 * i + 1] + src1[6 * i + 4];
int r= src1[6*i + 2] + src1[6*i + 5]; int r = src1[6 * i + 2] + src1[6 * i + 5];
dstU[i]= (RU*r + GU*g + BU*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5); dstU[i] = (RU*r + GU*g + BU*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
dstV[i]= (RV*r + GV*g + BV*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5); dstV[i] = (RV*r + GV*g + BV*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
} }
assert(src1 == src2); assert(src1 == src2);
} }
...@@ -590,12 +626,12 @@ static void rgb24ToY_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, ...@@ -590,12 +626,12 @@ static void rgb24ToY_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1,
uint32_t *unused) uint32_t *unused)
{ {
int i; int i;
for (i=0; i<width; i++) { for (i = 0; i < width; i++) {
int r= src[i*3+0]; int r = src[i * 3 + 0];
int g= src[i*3+1]; int g = src[i * 3 + 1];
int b= src[i*3+2]; int b = src[i * 3 + 2];
dst[i]= ((RY*r + GY*g + BY*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6)); dst[i] = ((RY*r + GY*g + BY*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
} }
} }
...@@ -603,14 +639,14 @@ static void rgb24ToUV_c(int16_t *dstU, int16_t *dstV, const uint8_t *unused0, co ...@@ -603,14 +639,14 @@ static void rgb24ToUV_c(int16_t *dstU, int16_t *dstV, const uint8_t *unused0, co
const uint8_t *src2, int width, uint32_t *unused) const uint8_t *src2, int width, uint32_t *unused)
{ {
int i; int i;
assert(src1==src2); assert(src1 == src2);
for (i=0; i<width; i++) { for (i = 0; i < width; i++) {
int r= src1[3*i + 0]; int r = src1[3 * i + 0];
int g= src1[3*i + 1]; int g = src1[3 * i + 1];
int b= src1[3*i + 2]; int b = src1[3 * i + 2];
dstU[i]= (RU*r + GU*g + BU*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6); dstU[i] = (RU*r + GU*g + BU*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
dstV[i]= (RV*r + GV*g + BV*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6); dstV[i] = (RV*r + GV*g + BV*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
} }
} }
...@@ -618,14 +654,14 @@ static void rgb24ToUV_half_c(int16_t *dstU, int16_t *dstV, const uint8_t *unused ...@@ -618,14 +654,14 @@ static void rgb24ToUV_half_c(int16_t *dstU, int16_t *dstV, const uint8_t *unused
const uint8_t *src2, int width, uint32_t *unused) const uint8_t *src2, int width, uint32_t *unused)
{ {
int i; int i;
assert(src1==src2); assert(src1 == src2);
for (i=0; i<width; i++) { for (i = 0; i < width; i++) {
int r= src1[6*i + 0] + src1[6*i + 3]; int r = src1[6 * i + 0] + src1[6 * i + 3];
int g= src1[6*i + 1] + src1[6*i + 4]; int g = src1[6 * i + 1] + src1[6 * i + 4];
int b= src1[6*i + 2] + src1[6*i + 5]; int b = src1[6 * i + 2] + src1[6 * i + 5];
dstU[i]= (RU*r + GU*g + BU*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5); dstU[i] = (RU*r + GU*g + BU*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
dstV[i]= (RV*r + GV*g + BV*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5); dstV[i] = (RV*r + GV*g + BV*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
} }
} }
...@@ -644,8 +680,8 @@ static void planar_rgb_to_y(uint16_t *dst, const uint8_t *src[4], int width) ...@@ -644,8 +680,8 @@ static void planar_rgb_to_y(uint16_t *dst, const uint8_t *src[4], int width)
static void planar_rgb16le_to_y(uint8_t *_dst, const uint8_t *_src[4], int width) static void planar_rgb16le_to_y(uint8_t *_dst, const uint8_t *_src[4], int width)
{ {
int i; int i;
const uint16_t **src = (const uint16_t **) _src; const uint16_t **src = (const uint16_t **)_src;
uint16_t *dst = (uint16_t *) _dst; uint16_t *dst = (uint16_t *)_dst;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
int g = AV_RL16(src[0] + i); int g = AV_RL16(src[0] + i);
int b = AV_RL16(src[1] + i); int b = AV_RL16(src[1] + i);
...@@ -658,8 +694,8 @@ static void planar_rgb16le_to_y(uint8_t *_dst, const uint8_t *_src[4], int width ...@@ -658,8 +694,8 @@ static void planar_rgb16le_to_y(uint8_t *_dst, const uint8_t *_src[4], int width
static void planar_rgb16be_to_y(uint8_t *_dst, const uint8_t *_src[4], int width) static void planar_rgb16be_to_y(uint8_t *_dst, const uint8_t *_src[4], int width)
{ {
int i; int i;
const uint16_t **src = (const uint16_t **) _src; const uint16_t **src = (const uint16_t **)_src;
uint16_t *dst = (uint16_t *) _dst; uint16_t *dst = (uint16_t *)_dst;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
int g = AV_RB16(src[0] + i); int g = AV_RB16(src[0] + i);
int b = AV_RB16(src[1] + i); int b = AV_RB16(src[1] + i);
...@@ -682,12 +718,13 @@ static void planar_rgb_to_uv(uint16_t *dstU, uint16_t *dstV, const uint8_t *src[ ...@@ -682,12 +718,13 @@ static void planar_rgb_to_uv(uint16_t *dstU, uint16_t *dstV, const uint8_t *src[
} }
} }
static void planar_rgb16le_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *_src[4], int width) static void planar_rgb16le_to_uv(uint8_t *_dstU, uint8_t *_dstV,
const uint8_t *_src[4], int width)
{ {
int i; int i;
const uint16_t **src = (const uint16_t **) _src; const uint16_t **src = (const uint16_t **)_src;
uint16_t *dstU = (uint16_t *) _dstU; uint16_t *dstU = (uint16_t *)_dstU;
uint16_t *dstV = (uint16_t *) _dstV; uint16_t *dstV = (uint16_t *)_dstV;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
int g = AV_RL16(src[0] + i); int g = AV_RL16(src[0] + i);
int b = AV_RL16(src[1] + i); int b = AV_RL16(src[1] + i);
...@@ -698,12 +735,13 @@ static void planar_rgb16le_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t * ...@@ -698,12 +735,13 @@ static void planar_rgb16le_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *
} }
} }
static void planar_rgb16be_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *_src[4], int width) static void planar_rgb16be_to_uv(uint8_t *_dstU, uint8_t *_dstV,
const uint8_t *_src[4], int width)
{ {
int i; int i;
const uint16_t **src = (const uint16_t **) _src; const uint16_t **src = (const uint16_t **)_src;
uint16_t *dstU = (uint16_t *) _dstU; uint16_t *dstU = (uint16_t *)_dstU;
uint16_t *dstV = (uint16_t *) _dstV; uint16_t *dstV = (uint16_t *)_dstV;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
int g = AV_RB16(src[0] + i); int g = AV_RB16(src[0] + i);
int b = AV_RB16(src[1] + i); int b = AV_RB16(src[1] + i);
...@@ -719,99 +757,217 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) ...@@ -719,99 +757,217 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
enum PixelFormat srcFormat = c->srcFormat; enum PixelFormat srcFormat = c->srcFormat;
c->chrToYV12 = NULL; c->chrToYV12 = NULL;
switch(srcFormat) { switch (srcFormat) {
case PIX_FMT_YUYV422 : c->chrToYV12 = yuy2ToUV_c; break; case PIX_FMT_YUYV422:
case PIX_FMT_UYVY422 : c->chrToYV12 = uyvyToUV_c; break; c->chrToYV12 = yuy2ToUV_c;
case PIX_FMT_NV12 : c->chrToYV12 = nv12ToUV_c; break; break;
case PIX_FMT_NV21 : c->chrToYV12 = nv21ToUV_c; break; case PIX_FMT_UYVY422:
case PIX_FMT_RGB8 : c->chrToYV12 = uyvyToUV_c;
case PIX_FMT_BGR8 : break;
case PIX_FMT_PAL8 : case PIX_FMT_NV12:
case PIX_FMT_BGR4_BYTE: c->chrToYV12 = nv12ToUV_c;
case PIX_FMT_RGB4_BYTE: c->chrToYV12 = palToUV_c; break; break;
case PIX_FMT_GBRP9LE: case PIX_FMT_NV21:
case PIX_FMT_GBRP10LE: c->chrToYV12 = nv21ToUV_c;
case PIX_FMT_GBRP16LE: c->readChrPlanar = planar_rgb16le_to_uv; break; break;
case PIX_FMT_GBRP9BE: case PIX_FMT_RGB8:
case PIX_FMT_GBRP10BE: case PIX_FMT_BGR8:
case PIX_FMT_GBRP16BE: c->readChrPlanar = planar_rgb16be_to_uv; break; case PIX_FMT_PAL8:
case PIX_FMT_GBRP: c->readChrPlanar = planar_rgb_to_uv; break; case PIX_FMT_BGR4_BYTE:
case PIX_FMT_RGB4_BYTE:
c->chrToYV12 = palToUV_c;
break;
case PIX_FMT_GBRP9LE:
case PIX_FMT_GBRP10LE:
case PIX_FMT_GBRP16LE:
c->readChrPlanar = planar_rgb16le_to_uv;
break;
case PIX_FMT_GBRP9BE:
case PIX_FMT_GBRP10BE:
case PIX_FMT_GBRP16BE:
c->readChrPlanar = planar_rgb16be_to_uv;
break;
case PIX_FMT_GBRP:
c->readChrPlanar = planar_rgb_to_uv;
break;
#if HAVE_BIGENDIAN #if HAVE_BIGENDIAN
case PIX_FMT_YUV444P9LE: case PIX_FMT_YUV444P9LE:
case PIX_FMT_YUV422P9LE: case PIX_FMT_YUV422P9LE:
case PIX_FMT_YUV420P9LE: case PIX_FMT_YUV420P9LE:
case PIX_FMT_YUV422P10LE: case PIX_FMT_YUV422P10LE:
case PIX_FMT_YUV444P10LE: case PIX_FMT_YUV444P10LE:
case PIX_FMT_YUV420P10LE: case PIX_FMT_YUV420P10LE:
case PIX_FMT_YUV420P16LE: case PIX_FMT_YUV420P16LE:
case PIX_FMT_YUV422P16LE: case PIX_FMT_YUV422P16LE:
case PIX_FMT_YUV444P16LE: c->chrToYV12 = bswap16UV_c; break; case PIX_FMT_YUV444P16LE:
c->chrToYV12 = bswap16UV_c;
break;
#else #else
case PIX_FMT_YUV444P9BE: case PIX_FMT_YUV444P9BE:
case PIX_FMT_YUV422P9BE: case PIX_FMT_YUV422P9BE:
case PIX_FMT_YUV420P9BE: case PIX_FMT_YUV420P9BE:
case PIX_FMT_YUV444P10BE: case PIX_FMT_YUV444P10BE:
case PIX_FMT_YUV422P10BE: case PIX_FMT_YUV422P10BE:
case PIX_FMT_YUV420P10BE: case PIX_FMT_YUV420P10BE:
case PIX_FMT_YUV420P16BE: case PIX_FMT_YUV420P16BE:
case PIX_FMT_YUV422P16BE: case PIX_FMT_YUV422P16BE:
case PIX_FMT_YUV444P16BE: c->chrToYV12 = bswap16UV_c; break; case PIX_FMT_YUV444P16BE:
c->chrToYV12 = bswap16UV_c;
break;
#endif #endif
} }
if (c->chrSrcHSubSample) { if (c->chrSrcHSubSample) {
switch(srcFormat) { switch (srcFormat) {
case PIX_FMT_RGBA64BE: c->chrToYV12 = rgb64BEToUV_half_c; break; case PIX_FMT_RGBA64BE:
case PIX_FMT_RGBA64LE: c->chrToYV12 = rgb64LEToUV_half_c; break; c->chrToYV12 = rgb64BEToUV_half_c;
case PIX_FMT_RGB48BE : c->chrToYV12 = rgb48BEToUV_half_c; break; break;
case PIX_FMT_RGB48LE : c->chrToYV12 = rgb48LEToUV_half_c; break; case PIX_FMT_RGBA64LE:
case PIX_FMT_BGR48BE : c->chrToYV12 = bgr48BEToUV_half_c; break; c->chrToYV12 = rgb64LEToUV_half_c;
case PIX_FMT_BGR48LE : c->chrToYV12 = bgr48LEToUV_half_c; break; break;
case PIX_FMT_RGB32 : c->chrToYV12 = bgr32ToUV_half_c; break; case PIX_FMT_RGB48BE:
case PIX_FMT_RGB32_1 : c->chrToYV12 = bgr321ToUV_half_c; break; c->chrToYV12 = rgb48BEToUV_half_c;
case PIX_FMT_BGR24 : c->chrToYV12 = bgr24ToUV_half_c; break; break;
case PIX_FMT_BGR565LE: c->chrToYV12 = bgr16leToUV_half_c; break; case PIX_FMT_RGB48LE:
case PIX_FMT_BGR565BE: c->chrToYV12 = bgr16beToUV_half_c; break; c->chrToYV12 = rgb48LEToUV_half_c;
case PIX_FMT_BGR555LE: c->chrToYV12 = bgr15leToUV_half_c; break; break;
case PIX_FMT_BGR555BE: c->chrToYV12 = bgr15beToUV_half_c; break; case PIX_FMT_BGR48BE:
case PIX_FMT_BGR444LE: c->chrToYV12 = bgr12leToUV_half_c; break; c->chrToYV12 = bgr48BEToUV_half_c;
case PIX_FMT_BGR444BE: c->chrToYV12 = bgr12beToUV_half_c; break; break;
case PIX_FMT_BGR32 : c->chrToYV12 = rgb32ToUV_half_c; break; case PIX_FMT_BGR48LE:
case PIX_FMT_BGR32_1 : c->chrToYV12 = rgb321ToUV_half_c; break; c->chrToYV12 = bgr48LEToUV_half_c;
case PIX_FMT_RGB24 : c->chrToYV12 = rgb24ToUV_half_c; break; break;
case PIX_FMT_RGB565LE: c->chrToYV12 = rgb16leToUV_half_c; break; case PIX_FMT_RGB32:
case PIX_FMT_RGB565BE: c->chrToYV12 = rgb16beToUV_half_c; break; c->chrToYV12 = bgr32ToUV_half_c;
case PIX_FMT_RGB555LE: c->chrToYV12 = rgb15leToUV_half_c; break; break;
case PIX_FMT_RGB555BE: c->chrToYV12 = rgb15beToUV_half_c; break; case PIX_FMT_RGB32_1:
case PIX_FMT_GBR24P : c->chrToYV12 = gbr24pToUV_half_c; break; c->chrToYV12 = bgr321ToUV_half_c;
case PIX_FMT_RGB444LE: c->chrToYV12 = rgb12leToUV_half_c; break; break;
case PIX_FMT_RGB444BE: c->chrToYV12 = rgb12beToUV_half_c; break; case PIX_FMT_BGR24:
c->chrToYV12 = bgr24ToUV_half_c;
break;
case PIX_FMT_BGR565LE:
c->chrToYV12 = bgr16leToUV_half_c;
break;
case PIX_FMT_BGR565BE:
c->chrToYV12 = bgr16beToUV_half_c;
break;
case PIX_FMT_BGR555LE:
c->chrToYV12 = bgr15leToUV_half_c;
break;
case PIX_FMT_BGR555BE:
c->chrToYV12 = bgr15beToUV_half_c;
break;
case PIX_FMT_GBR24P :
c->chrToYV12 = gbr24pToUV_half_c;
break;
case PIX_FMT_BGR444LE:
c->chrToYV12 = bgr12leToUV_half_c;
break;
case PIX_FMT_BGR444BE:
c->chrToYV12 = bgr12beToUV_half_c;
break;
case PIX_FMT_BGR32:
c->chrToYV12 = rgb32ToUV_half_c;
break;
case PIX_FMT_BGR32_1:
c->chrToYV12 = rgb321ToUV_half_c;
break;
case PIX_FMT_RGB24:
c->chrToYV12 = rgb24ToUV_half_c;
break;
case PIX_FMT_RGB565LE:
c->chrToYV12 = rgb16leToUV_half_c;
break;
case PIX_FMT_RGB565BE:
c->chrToYV12 = rgb16beToUV_half_c;
break;
case PIX_FMT_RGB555LE:
c->chrToYV12 = rgb15leToUV_half_c;
break;
case PIX_FMT_RGB555BE:
c->chrToYV12 = rgb15beToUV_half_c;
break;
case PIX_FMT_RGB444LE:
c->chrToYV12 = rgb12leToUV_half_c;
break;
case PIX_FMT_RGB444BE:
c->chrToYV12 = rgb12beToUV_half_c;
break;
} }
} else { } else {
switch(srcFormat) { switch (srcFormat) {
case PIX_FMT_RGBA64BE: c->chrToYV12 = rgb64BEToUV_c; break; case PIX_FMT_RGBA64BE:
case PIX_FMT_RGBA64LE: c->chrToYV12 = rgb64LEToUV_c; break; c->chrToYV12 = rgb64BEToUV_c;
case PIX_FMT_RGB48BE : c->chrToYV12 = rgb48BEToUV_c; break; break;
case PIX_FMT_RGB48LE : c->chrToYV12 = rgb48LEToUV_c; break; case PIX_FMT_RGBA64LE:
case PIX_FMT_BGR48BE : c->chrToYV12 = bgr48BEToUV_c; break; c->chrToYV12 = rgb64LEToUV_c;
case PIX_FMT_BGR48LE : c->chrToYV12 = bgr48LEToUV_c; break; break;
case PIX_FMT_RGB32 : c->chrToYV12 = bgr32ToUV_c; break; case PIX_FMT_RGB48BE:
case PIX_FMT_RGB32_1 : c->chrToYV12 = bgr321ToUV_c; break; c->chrToYV12 = rgb48BEToUV_c;
case PIX_FMT_BGR24 : c->chrToYV12 = bgr24ToUV_c; break; break;
case PIX_FMT_BGR565LE: c->chrToYV12 = bgr16leToUV_c; break; case PIX_FMT_RGB48LE:
case PIX_FMT_BGR565BE: c->chrToYV12 = bgr16beToUV_c; break; c->chrToYV12 = rgb48LEToUV_c;
case PIX_FMT_BGR555LE: c->chrToYV12 = bgr15leToUV_c; break; break;
case PIX_FMT_BGR555BE: c->chrToYV12 = bgr15beToUV_c; break; case PIX_FMT_BGR48BE:
case PIX_FMT_BGR444LE: c->chrToYV12 = bgr12leToUV_c; break; c->chrToYV12 = bgr48BEToUV_c;
case PIX_FMT_BGR444BE: c->chrToYV12 = bgr12beToUV_c; break; break;
case PIX_FMT_BGR32 : c->chrToYV12 = rgb32ToUV_c; break; case PIX_FMT_BGR48LE:
case PIX_FMT_BGR32_1 : c->chrToYV12 = rgb321ToUV_c; break; c->chrToYV12 = bgr48LEToUV_c;
case PIX_FMT_RGB24 : c->chrToYV12 = rgb24ToUV_c; break; break;
case PIX_FMT_RGB565LE: c->chrToYV12 = rgb16leToUV_c; break; case PIX_FMT_RGB32:
case PIX_FMT_RGB565BE: c->chrToYV12 = rgb16beToUV_c; break; c->chrToYV12 = bgr32ToUV_c;
case PIX_FMT_RGB555LE: c->chrToYV12 = rgb15leToUV_c; break; break;
case PIX_FMT_RGB555BE: c->chrToYV12 = rgb15beToUV_c; break; case PIX_FMT_RGB32_1:
case PIX_FMT_RGB444LE: c->chrToYV12 = rgb12leToUV_c; break; c->chrToYV12 = bgr321ToUV_c;
case PIX_FMT_RGB444BE: c->chrToYV12 = rgb12beToUV_c; break; break;
case PIX_FMT_BGR24:
c->chrToYV12 = bgr24ToUV_c;
break;
case PIX_FMT_BGR565LE:
c->chrToYV12 = bgr16leToUV_c;
break;
case PIX_FMT_BGR565BE:
c->chrToYV12 = bgr16beToUV_c;
break;
case PIX_FMT_BGR555LE:
c->chrToYV12 = bgr15leToUV_c;
break;
case PIX_FMT_BGR555BE:
c->chrToYV12 = bgr15beToUV_c;
break;
case PIX_FMT_BGR444LE:
c->chrToYV12 = bgr12leToUV_c;
break;
case PIX_FMT_BGR444BE:
c->chrToYV12 = bgr12beToUV_c;
break;
case PIX_FMT_BGR32:
c->chrToYV12 = rgb32ToUV_c;
break;
case PIX_FMT_BGR32_1:
c->chrToYV12 = rgb321ToUV_c;
break;
case PIX_FMT_RGB24:
c->chrToYV12 = rgb24ToUV_c;
break;
case PIX_FMT_RGB565LE:
c->chrToYV12 = rgb16leToUV_c;
break;
case PIX_FMT_RGB565BE:
c->chrToYV12 = rgb16beToUV_c;
break;
case PIX_FMT_RGB555LE:
c->chrToYV12 = rgb15leToUV_c;
break;
case PIX_FMT_RGB555BE:
c->chrToYV12 = rgb15beToUV_c;
break;
case PIX_FMT_RGB444LE:
c->chrToYV12 = rgb12leToUV_c;
break;
case PIX_FMT_RGB444BE:
c->chrToYV12 = rgb12beToUV_c;
break;
} }
} }
...@@ -820,11 +976,17 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) ...@@ -820,11 +976,17 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
switch (srcFormat) { switch (srcFormat) {
case PIX_FMT_GBRP9LE: case PIX_FMT_GBRP9LE:
case PIX_FMT_GBRP10LE: case PIX_FMT_GBRP10LE:
case PIX_FMT_GBRP16LE: c->readLumPlanar = planar_rgb16le_to_y; break; case PIX_FMT_GBRP16LE:
c->readLumPlanar = planar_rgb16le_to_y;
break;
case PIX_FMT_GBRP9BE: case PIX_FMT_GBRP9BE:
case PIX_FMT_GBRP10BE: case PIX_FMT_GBRP10BE:
case PIX_FMT_GBRP16BE: c->readLumPlanar = planar_rgb16be_to_y; break; case PIX_FMT_GBRP16BE:
case PIX_FMT_GBRP: c->readLumPlanar = planar_rgb_to_y; break; c->readLumPlanar = planar_rgb16be_to_y;
break;
case PIX_FMT_GBRP:
c->readLumPlanar = planar_rgb_to_y;
break;
#if HAVE_BIGENDIAN #if HAVE_BIGENDIAN
case PIX_FMT_YUV444P9LE: case PIX_FMT_YUV444P9LE:
case PIX_FMT_YUV422P9LE: case PIX_FMT_YUV422P9LE:
...@@ -835,7 +997,9 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) ...@@ -835,7 +997,9 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
case PIX_FMT_YUV420P16LE: case PIX_FMT_YUV420P16LE:
case PIX_FMT_YUV422P16LE: case PIX_FMT_YUV422P16LE:
case PIX_FMT_YUV444P16LE: case PIX_FMT_YUV444P16LE:
case PIX_FMT_GRAY16LE: c->lumToYV12 = bswap16Y_c; break; case PIX_FMT_GRAY16LE:
c->lumToYV12 = bswap16Y_c;
break;
#else #else
case PIX_FMT_YUV444P9BE: case PIX_FMT_YUV444P9BE:
case PIX_FMT_YUV422P9BE: case PIX_FMT_YUV422P9BE:
...@@ -846,53 +1010,121 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) ...@@ -846,53 +1010,121 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
case PIX_FMT_YUV420P16BE: case PIX_FMT_YUV420P16BE:
case PIX_FMT_YUV422P16BE: case PIX_FMT_YUV422P16BE:
case PIX_FMT_YUV444P16BE: case PIX_FMT_YUV444P16BE:
case PIX_FMT_GRAY16BE: c->lumToYV12 = bswap16Y_c; break; case PIX_FMT_GRAY16BE:
c->lumToYV12 = bswap16Y_c;
break;
#endif #endif
case PIX_FMT_YUYV422 : case PIX_FMT_YUYV422:
case PIX_FMT_Y400A : c->lumToYV12 = yuy2ToY_c; break; case PIX_FMT_Y400A:
case PIX_FMT_UYVY422 : c->lumToYV12 = uyvyToY_c; break; c->lumToYV12 = yuy2ToY_c;
case PIX_FMT_BGR24 : c->lumToYV12 = bgr24ToY_c; break; break;
case PIX_FMT_BGR565LE : c->lumToYV12 = bgr16leToY_c; break; case PIX_FMT_UYVY422:
case PIX_FMT_BGR565BE : c->lumToYV12 = bgr16beToY_c; break; c->lumToYV12 = uyvyToY_c;
case PIX_FMT_BGR555LE : c->lumToYV12 = bgr15leToY_c; break; break;
case PIX_FMT_BGR555BE : c->lumToYV12 = bgr15beToY_c; break; case PIX_FMT_BGR24:
case PIX_FMT_BGR444LE : c->lumToYV12 = bgr12leToY_c; break; c->lumToYV12 = bgr24ToY_c;
case PIX_FMT_BGR444BE : c->lumToYV12 = bgr12beToY_c; break; break;
case PIX_FMT_RGB24 : c->lumToYV12 = rgb24ToY_c; break; case PIX_FMT_BGR565LE:
case PIX_FMT_RGB565LE : c->lumToYV12 = rgb16leToY_c; break; c->lumToYV12 = bgr16leToY_c;
case PIX_FMT_RGB565BE : c->lumToYV12 = rgb16beToY_c; break; break;
case PIX_FMT_RGB555LE : c->lumToYV12 = rgb15leToY_c; break; case PIX_FMT_BGR565BE:
case PIX_FMT_RGB555BE : c->lumToYV12 = rgb15beToY_c; break; c->lumToYV12 = bgr16beToY_c;
case PIX_FMT_RGB444LE : c->lumToYV12 = rgb12leToY_c; break; break;
case PIX_FMT_RGB444BE : c->lumToYV12 = rgb12beToY_c; break; case PIX_FMT_BGR555LE:
case PIX_FMT_RGB8 : c->lumToYV12 = bgr15leToY_c;
case PIX_FMT_BGR8 : break;
case PIX_FMT_PAL8 : case PIX_FMT_BGR555BE:
c->lumToYV12 = bgr15beToY_c;
break;
case PIX_FMT_BGR444LE:
c->lumToYV12 = bgr12leToY_c;
break;
case PIX_FMT_BGR444BE:
c->lumToYV12 = bgr12beToY_c;
break;
case PIX_FMT_RGB24:
c->lumToYV12 = rgb24ToY_c;
break;
case PIX_FMT_RGB565LE:
c->lumToYV12 = rgb16leToY_c;
break;
case PIX_FMT_RGB565BE:
c->lumToYV12 = rgb16beToY_c;
break;
case PIX_FMT_RGB555LE:
c->lumToYV12 = rgb15leToY_c;
break;
case PIX_FMT_RGB555BE:
c->lumToYV12 = rgb15beToY_c;
break;
case PIX_FMT_RGB444LE:
c->lumToYV12 = rgb12leToY_c;
break;
case PIX_FMT_RGB444BE:
c->lumToYV12 = rgb12beToY_c;
break;
case PIX_FMT_RGB8:
case PIX_FMT_BGR8:
case PIX_FMT_PAL8:
case PIX_FMT_BGR4_BYTE: case PIX_FMT_BGR4_BYTE:
case PIX_FMT_RGB4_BYTE: c->lumToYV12 = palToY_c; break; case PIX_FMT_RGB4_BYTE:
case PIX_FMT_MONOBLACK: c->lumToYV12 = monoblack2Y_c; break; c->lumToYV12 = palToY_c;
case PIX_FMT_MONOWHITE: c->lumToYV12 = monowhite2Y_c; break; break;
case PIX_FMT_RGB32 : c->lumToYV12 = bgr32ToY_c; break; case PIX_FMT_MONOBLACK:
case PIX_FMT_RGB32_1: c->lumToYV12 = bgr321ToY_c; break; c->lumToYV12 = monoblack2Y_c;
case PIX_FMT_BGR32 : c->lumToYV12 = rgb32ToY_c; break; break;
case PIX_FMT_BGR32_1: c->lumToYV12 = rgb321ToY_c; break; case PIX_FMT_MONOWHITE:
case PIX_FMT_RGB48BE: c->lumToYV12 = rgb48BEToY_c; break; c->lumToYV12 = monowhite2Y_c;
case PIX_FMT_RGB48LE: c->lumToYV12 = rgb48LEToY_c; break; break;
case PIX_FMT_BGR48BE: c->lumToYV12 = bgr48BEToY_c; break; case PIX_FMT_RGB32:
case PIX_FMT_BGR48LE: c->lumToYV12 = bgr48LEToY_c; break; c->lumToYV12 = bgr32ToY_c;
case PIX_FMT_RGBA64BE:c->lumToYV12 = rgb64BEToY_c; break; break;
case PIX_FMT_RGBA64LE:c->lumToYV12 = rgb64LEToY_c; break; case PIX_FMT_RGB32_1:
c->lumToYV12 = bgr321ToY_c;
break;
case PIX_FMT_BGR32:
c->lumToYV12 = rgb32ToY_c;
break;
case PIX_FMT_BGR32_1:
c->lumToYV12 = rgb321ToY_c;
break;
case PIX_FMT_RGB48BE:
c->lumToYV12 = rgb48BEToY_c;
break;
case PIX_FMT_RGB48LE:
c->lumToYV12 = rgb48LEToY_c;
break;
case PIX_FMT_BGR48BE:
c->lumToYV12 = bgr48BEToY_c;
break;
case PIX_FMT_BGR48LE:
c->lumToYV12 = bgr48LEToY_c;
break;
case PIX_FMT_RGBA64BE:
c->lumToYV12 = rgb64BEToY_c;
break;
case PIX_FMT_RGBA64LE:
c->lumToYV12 = rgb64LEToY_c;
break;
} }
if (c->alpPixBuf) { if (c->alpPixBuf) {
switch (srcFormat) { switch (srcFormat) {
case PIX_FMT_RGBA64LE: case PIX_FMT_RGBA64LE:
case PIX_FMT_RGBA64BE: c->alpToYV12 = rgba64ToA_c; break; case PIX_FMT_RGBA64BE: c->alpToYV12 = rgba64ToA_c; break;
case PIX_FMT_BGRA: case PIX_FMT_BGRA:
case PIX_FMT_RGBA: c->alpToYV12 = rgbaToA_c; break; case PIX_FMT_RGBA:
c->alpToYV12 = rgbaToA_c;
break;
case PIX_FMT_ABGR: case PIX_FMT_ABGR:
case PIX_FMT_ARGB: c->alpToYV12 = abgrToA_c; break; case PIX_FMT_ARGB:
case PIX_FMT_Y400A: c->alpToYV12 = uyvyToY_c; break; c->alpToYV12 = abgrToA_c;
case PIX_FMT_PAL8 : c->alpToYV12 = palToA_c; break; break;
case PIX_FMT_Y400A:
c->alpToYV12 = uyvyToY_c;
break;
case PIX_FMT_PAL8 :
c->alpToYV12 = palToA_c;
break;
} }
} }
} }
...@@ -30,7 +30,7 @@ ret: 0 st: 0 flags:1 ts: 2.413000 ...@@ -30,7 +30,7 @@ ret: 0 st: 0 flags:1 ts: 2.413000
ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292193 size: 27834 ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292193 size: 27834
ret:-1 st: 1 flags:0 ts: 1.307000 ret:-1 st: 1 flags:0 ts: 1.307000
ret: 0 st: 1 flags:1 ts: 0.201000 ret: 0 st: 1 flags:1 ts: 0.201000
ret: 0 st: 1 flags:1 dts: 0.198000 pts: 0.198000 pos: 555 size: 208 ret: 0 st: 1 flags:1 dts: 0.015000 pts: 0.015000 pos: 555 size: 208
ret: 0 st:-1 flags:0 ts:-0.904994 ret: 0 st:-1 flags:0 ts:-0.904994
ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 555 size: 208 ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 555 size: 208
ret: 0 st:-1 flags:1 ts: 1.989173 ret: 0 st:-1 flags:1 ts: 1.989173
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment