mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: bitstream: Properly promote av_reverse values before shifting. libavutil/swscale: YUV444P10/YUV444P9 support. H.264: Fix high bit depth explicit biweight h264: Fix 10-bit H.264 x86 chroma v loopfilter asm. Replace DEBUG_SEEK/DEBUG_SI + av_log combinations by av_dlog. Update copyright year for ac3enc_opts_template.c. adts: Adjust frame size mask to follow the specification. movenc: Add RTP muxer/hinter options movenc: Pass the RTP AVFormatContext to the SDP generation rtspenc: Add RTP muxer options rtspenc: Add an AVClass for setting muxer specific options rtpenc_chain: Pass the rtpflags options through to the chained muxer rtpenc: Declare the rtp flags private AVOptions in rtpenc.h sdp: Reindent after the previous commit rtpenc: MP4A-LATM payload support avoptions: Add an av_opt_flag_is_set function for inspecting flag fields sdp: Allow passing an AVFormatContext to the SDP generation mov: Fix wrong timestamp generation for fragmented movies that have time offset caused by the first edit list entry. mpeg12: more advanced ffmpeg mpeg2 aspect guessing code. swscale: split YUYV output out of yuv2packed[12X]_c(). Conflicts: doc/APIchanges libavcodec/Makefile libavcodec/h264dsp_template.c libavcodec/mpeg12.c libavformat/aacdec.c libavformat/avidec.c libavformat/internal.h libavformat/movenc.c libavformat/rtpenc.c libavformat/rtpenc_latm.c libavformat/sdp.c libavformat/version.h libavutil/avutil.h libavutil/pixfmt.h libswscale/swscale.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
45fb647495
@ -13,6 +13,9 @@ libavutil: 2011-04-18
|
|||||||
|
|
||||||
API changes, most recent first:
|
API changes, most recent first:
|
||||||
|
|
||||||
|
2011-06-xx - xxxxxxx - lavu 51.6.0 - opt.h
|
||||||
|
Add av_opt_flag_is_set().
|
||||||
|
|
||||||
2011-06-10 - c381960 - lavfi 2.15.0 - avfilter_get_audio_buffer_ref_from_arrays
|
2011-06-10 - c381960 - lavfi 2.15.0 - avfilter_get_audio_buffer_ref_from_arrays
|
||||||
Add avfilter_get_audio_buffer_ref_from_arrays() to avfilter.h.
|
Add avfilter_get_audio_buffer_ref_from_arrays() to avfilter.h.
|
||||||
|
|
||||||
|
@ -558,7 +558,7 @@ OBJS-$(CONFIG_OGG_DEMUXER) += flacdec.o flacdata.o flac.o \
|
|||||||
dirac.o mpeg12data.o vorbis_data.o
|
dirac.o mpeg12data.o vorbis_data.o
|
||||||
OBJS-$(CONFIG_OGG_MUXER) += xiph.o flacdec.o flacdata.o flac.o \
|
OBJS-$(CONFIG_OGG_MUXER) += xiph.o flacdec.o flacdata.o flac.o \
|
||||||
vorbis_data.o
|
vorbis_data.o
|
||||||
OBJS-$(CONFIG_RTP_MUXER) += mpegvideo.o xiph.o
|
OBJS-$(CONFIG_RTP_MUXER) += mpeg4audio.o mpegvideo.o xiph.o
|
||||||
OBJS-$(CONFIG_SPDIF_DEMUXER) += aacadtsdec.o mpeg4audio.o
|
OBJS-$(CONFIG_SPDIF_DEMUXER) += aacadtsdec.o mpeg4audio.o
|
||||||
OBJS-$(CONFIG_WEBM_MUXER) += xiph.o mpeg4audio.o \
|
OBJS-$(CONFIG_WEBM_MUXER) += xiph.o mpeg4audio.o \
|
||||||
flacdec.o flacdata.o flac.o \
|
flacdec.o flacdata.o flac.o \
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* AC-3 encoder options
|
* AC-3 encoder options
|
||||||
* Copyright (c) 2010 Justin Ruggles <justin.ruggles@gmail.com>
|
* Copyright (c) 2011 Justin Ruggles <justin.ruggles@gmail.com>
|
||||||
*
|
*
|
||||||
* This file is part of FFmpeg.
|
* This file is part of FFmpeg.
|
||||||
*
|
*
|
||||||
|
@ -118,10 +118,10 @@ static int alloc_table(VLC *vlc, int size, int use_static)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static av_always_inline uint32_t bitswap_32(uint32_t x) {
|
static av_always_inline uint32_t bitswap_32(uint32_t x) {
|
||||||
return av_reverse[x&0xFF]<<24
|
return (uint32_t)av_reverse[x&0xFF]<<24
|
||||||
| av_reverse[(x>>8)&0xFF]<<16
|
| (uint32_t)av_reverse[(x>>8)&0xFF]<<16
|
||||||
| av_reverse[(x>>16)&0xFF]<<8
|
| (uint32_t)av_reverse[(x>>16)&0xFF]<<8
|
||||||
| av_reverse[x>>24];
|
| (uint32_t)av_reverse[x>>24];
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -58,11 +58,12 @@ static void FUNCC(weight_h264_pixels ## W ## x ## H)(uint8_t *p_block, int strid
|
|||||||
op_scale1(15); \
|
op_scale1(15); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
static void FUNCC(biweight_h264_pixels ## W ## x ## H)(uint8_t *p_dst, uint8_t *p_src, int stride, int log2_denom, int weightd, int weights, int offset){ \
|
static void FUNCC(biweight_h264_pixels ## W ## x ## H)(uint8_t *_dst, uint8_t *_src, int stride, int log2_denom, int weightd, int weights, int offset){ \
|
||||||
int y; \
|
int y; \
|
||||||
pixel *dst = (pixel*)p_dst; \
|
pixel *dst = (pixel*)_dst; \
|
||||||
pixel *src = (pixel*)p_src; \
|
pixel *src = (pixel*)_src; \
|
||||||
stride >>= sizeof(pixel)-1; \
|
stride >>= sizeof(pixel)-1; \
|
||||||
|
offset <<= (BIT_DEPTH-8); \
|
||||||
offset = ((offset + 1) | 1) << log2_denom; \
|
offset = ((offset + 1) | 1) << log2_denom; \
|
||||||
for(y=0; y<H; y++, dst += stride, src += stride){ \
|
for(y=0; y<H; y++, dst += stride, src += stride){ \
|
||||||
op_scale2(0); \
|
op_scale2(0); \
|
||||||
|
@ -1331,19 +1331,17 @@ static int mpeg_decode_postinit(AVCodecContext *avctx){
|
|||||||
avctx->ticks_per_frame=2;
|
avctx->ticks_per_frame=2;
|
||||||
//MPEG-2 aspect
|
//MPEG-2 aspect
|
||||||
if(s->aspect_ratio_info > 1){
|
if(s->aspect_ratio_info > 1){
|
||||||
AVRational dar=
|
AVRational dar =
|
||||||
av_mul_q(
|
av_mul_q(
|
||||||
av_div_q(
|
av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
|
||||||
ff_mpeg2_aspect[s->aspect_ratio_info],
|
(AVRational){s1->pan_scan.width, s1->pan_scan.height}),
|
||||||
(AVRational){s1->pan_scan.width, s1->pan_scan.height}
|
|
||||||
),
|
|
||||||
(AVRational){s->width, s->height});
|
(AVRational){s->width, s->height});
|
||||||
|
|
||||||
//we ignore the spec here and guess a bit as reality does not match the spec, see for example
|
// we ignore the spec here and guess a bit as reality does not match the spec, see for example
|
||||||
// res_change_ffmpeg_aspect.ts and sequence-display-aspect.mpg
|
// res_change_ffmpeg_aspect.ts and sequence-display-aspect.mpg
|
||||||
//issue1613, 621, 562
|
// issue1613, 621, 562
|
||||||
if( (s1->pan_scan.width == 0 )||(s1->pan_scan.height == 0)
|
if((s1->pan_scan.width == 0 ) || (s1->pan_scan.height == 0) ||
|
||||||
|| (av_cmp_q(dar,(AVRational){4,3})&&av_cmp_q(dar,(AVRational){16,9}))){
|
(av_cmp_q(dar,(AVRational){4,3}) && av_cmp_q(dar,(AVRational){16,9}))) {
|
||||||
s->avctx->sample_aspect_ratio=
|
s->avctx->sample_aspect_ratio=
|
||||||
av_div_q(
|
av_div_q(
|
||||||
ff_mpeg2_aspect[s->aspect_ratio_info],
|
ff_mpeg2_aspect[s->aspect_ratio_info],
|
||||||
|
@ -836,6 +836,13 @@ DEBLOCK_LUMA_INTRA avx
|
|||||||
mova [r0+2*r1], m2
|
mova [r0+2*r1], m2
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
|
%macro CHROMA_V_LOAD_TC 2
|
||||||
|
movd %1, [%2]
|
||||||
|
punpcklbw %1, %1
|
||||||
|
punpcklwd %1, %1
|
||||||
|
psraw %1, 6
|
||||||
|
%endmacro
|
||||||
|
|
||||||
%macro DEBLOCK_CHROMA 1
|
%macro DEBLOCK_CHROMA 1
|
||||||
;-----------------------------------------------------------------------------
|
;-----------------------------------------------------------------------------
|
||||||
; void deblock_v_chroma( uint16_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
|
; void deblock_v_chroma( uint16_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
|
||||||
@ -854,7 +861,7 @@ cglobal deblock_v_chroma_10_%1, 5,7-(mmsize/16),8*(mmsize/16)
|
|||||||
LOAD_AB m4, m5, r2d, r3d
|
LOAD_AB m4, m5, r2d, r3d
|
||||||
LOAD_MASK m0, m1, m2, m3, m4, m5, m7, m6, m4
|
LOAD_MASK m0, m1, m2, m3, m4, m5, m7, m6, m4
|
||||||
pxor m4, m4
|
pxor m4, m4
|
||||||
LOAD_TC m6, r4
|
CHROMA_V_LOAD_TC m6, r4
|
||||||
psubw m6, [pw_3]
|
psubw m6, [pw_3]
|
||||||
pmaxsw m6, m4
|
pmaxsw m6, m4
|
||||||
pand m7, m6
|
pand m7, m6
|
||||||
|
@ -44,7 +44,7 @@ static int adts_aac_probe(AVProbeData *p)
|
|||||||
uint32_t header = AV_RB16(buf2);
|
uint32_t header = AV_RB16(buf2);
|
||||||
if((header&0xFFF6) != 0xFFF0)
|
if((header&0xFFF6) != 0xFFF0)
|
||||||
break;
|
break;
|
||||||
fsize = (AV_RB32(buf2+3)>>13) & 0x1FFF;
|
fsize = (AV_RB32(buf2 + 3) >> 13) & 0x1FFF;
|
||||||
if(fsize < 7)
|
if(fsize < 7)
|
||||||
break;
|
break;
|
||||||
buf2 += fsize;
|
buf2 += fsize;
|
||||||
|
@ -19,9 +19,6 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//#define DEBUG
|
|
||||||
//#define DEBUG_SEEK
|
|
||||||
|
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#include "libavutil/intreadwrite.h"
|
#include "libavutil/intreadwrite.h"
|
||||||
#include "libavutil/bswap.h"
|
#include "libavutil/bswap.h"
|
||||||
@ -160,10 +157,8 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){
|
|||||||
int64_t last_pos= -1;
|
int64_t last_pos= -1;
|
||||||
int64_t filesize= avio_size(s->pb);
|
int64_t filesize= avio_size(s->pb);
|
||||||
|
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "longs_pre_entry:%d index_type:%d entries_in_use:%d chunk_id:%X base:%16"PRIX64"\n",
|
||||||
av_log(s, AV_LOG_ERROR, "longs_pre_entry:%d index_type:%d entries_in_use:%d chunk_id:%X base:%16"PRIX64"\n",
|
|
||||||
longs_pre_entry,index_type, entries_in_use, chunk_id, base);
|
longs_pre_entry,index_type, entries_in_use, chunk_id, base);
|
||||||
#endif
|
|
||||||
|
|
||||||
if(stream_id >= s->nb_streams || stream_id < 0)
|
if(stream_id >= s->nb_streams || stream_id < 0)
|
||||||
return -1;
|
return -1;
|
||||||
@ -1182,10 +1177,8 @@ static int avi_read_idx1(AVFormatContext *s, int size)
|
|||||||
flags = avio_rl32(pb);
|
flags = avio_rl32(pb);
|
||||||
pos = avio_rl32(pb);
|
pos = avio_rl32(pb);
|
||||||
len = avio_rl32(pb);
|
len = avio_rl32(pb);
|
||||||
#if defined(DEBUG_SEEK)
|
av_dlog(s, "%d: tag=0x%x flags=0x%x pos=0x%x len=%d/",
|
||||||
av_log(s, AV_LOG_DEBUG, "%d: tag=0x%x flags=0x%x pos=0x%x len=%d/",
|
|
||||||
i, tag, flags, pos, len);
|
i, tag, flags, pos, len);
|
||||||
#endif
|
|
||||||
if(i==0 && pos > avi->movi_list)
|
if(i==0 && pos > avi->movi_list)
|
||||||
avi->movi_list= 0; //FIXME better check
|
avi->movi_list= 0; //FIXME better check
|
||||||
pos += avi->movi_list;
|
pos += avi->movi_list;
|
||||||
@ -1254,22 +1247,18 @@ static int avi_load_index(AVFormatContext *s)
|
|||||||
|
|
||||||
if (avio_seek(pb, avi->movi_end, SEEK_SET) < 0)
|
if (avio_seek(pb, avi->movi_end, SEEK_SET) < 0)
|
||||||
goto the_end; // maybe truncated file
|
goto the_end; // maybe truncated file
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "movi_end=0x%"PRIx64"\n", avi->movi_end);
|
||||||
av_log(s, AV_LOG_DEBUG, "movi_end=0x%"PRIx64"\n", avi->movi_end);
|
|
||||||
#endif
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
if (url_feof(pb))
|
if (url_feof(pb))
|
||||||
break;
|
break;
|
||||||
tag = avio_rl32(pb);
|
tag = avio_rl32(pb);
|
||||||
size = avio_rl32(pb);
|
size = avio_rl32(pb);
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "tag=%c%c%c%c size=0x%x\n",
|
||||||
av_log(s, AV_LOG_DEBUG, "tag=%c%c%c%c size=0x%x\n",
|
|
||||||
tag & 0xff,
|
tag & 0xff,
|
||||||
(tag >> 8) & 0xff,
|
(tag >> 8) & 0xff,
|
||||||
(tag >> 16) & 0xff,
|
(tag >> 16) & 0xff,
|
||||||
(tag >> 24) & 0xff,
|
(tag >> 24) & 0xff,
|
||||||
size);
|
size);
|
||||||
#endif
|
|
||||||
switch(tag) {
|
switch(tag) {
|
||||||
case MKTAG('i', 'd', 'x', '1'):
|
case MKTAG('i', 'd', 'x', '1'):
|
||||||
if (avi_read_idx1(s, size) < 0)
|
if (avi_read_idx1(s, size) < 0)
|
||||||
|
@ -163,8 +163,6 @@ static int ffm_read_data(AVFormatContext *s,
|
|||||||
return size1 - size;
|
return size1 - size;
|
||||||
}
|
}
|
||||||
|
|
||||||
//#define DEBUG_SEEK
|
|
||||||
|
|
||||||
/* ensure that acutal seeking happens between FFM_PACKET_SIZE
|
/* ensure that acutal seeking happens between FFM_PACKET_SIZE
|
||||||
and file_size - FFM_PACKET_SIZE */
|
and file_size - FFM_PACKET_SIZE */
|
||||||
static void ffm_seek1(AVFormatContext *s, int64_t pos1)
|
static void ffm_seek1(AVFormatContext *s, int64_t pos1)
|
||||||
@ -175,9 +173,7 @@ static void ffm_seek1(AVFormatContext *s, int64_t pos1)
|
|||||||
|
|
||||||
pos = FFMIN(pos1, ffm->file_size - FFM_PACKET_SIZE);
|
pos = FFMIN(pos1, ffm->file_size - FFM_PACKET_SIZE);
|
||||||
pos = FFMAX(pos, FFM_PACKET_SIZE);
|
pos = FFMAX(pos, FFM_PACKET_SIZE);
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "seek to %"PRIx64" -> %"PRIx64"\n", pos1, pos);
|
||||||
av_log(s, AV_LOG_DEBUG, "seek to %"PRIx64" -> %"PRIx64"\n", pos1, pos);
|
|
||||||
#endif
|
|
||||||
avio_seek(pb, pos, SEEK_SET);
|
avio_seek(pb, pos, SEEK_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,9 +185,7 @@ static int64_t get_dts(AVFormatContext *s, int64_t pos)
|
|||||||
ffm_seek1(s, pos);
|
ffm_seek1(s, pos);
|
||||||
avio_skip(pb, 4);
|
avio_skip(pb, 4);
|
||||||
dts = avio_rb64(pb);
|
dts = avio_rb64(pb);
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "dts=%0.6f\n", dts / 1000000.0);
|
||||||
av_log(s, AV_LOG_DEBUG, "dts=%0.6f\n", dts / 1000000.0);
|
|
||||||
#endif
|
|
||||||
return dts;
|
return dts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -464,9 +458,7 @@ static int ffm_seek(AVFormatContext *s, int stream_index, int64_t wanted_pts, in
|
|||||||
int64_t pts_min, pts_max, pts;
|
int64_t pts_min, pts_max, pts;
|
||||||
double pos1;
|
double pos1;
|
||||||
|
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "wanted_pts=%0.6f\n", wanted_pts / 1000000.0);
|
||||||
av_log(s, AV_LOG_DEBUG, "wanted_pts=%0.6f\n", wanted_pts / 1000000.0);
|
|
||||||
#endif
|
|
||||||
/* find the position using linear interpolation (better than
|
/* find the position using linear interpolation (better than
|
||||||
dichotomy in typical cases) */
|
dichotomy in typical cases) */
|
||||||
pos_min = FFM_PACKET_SIZE;
|
pos_min = FFM_PACKET_SIZE;
|
||||||
|
@ -122,11 +122,12 @@ int ff_url_join(char *str, int size, const char *proto,
|
|||||||
* @param dest_type the destination address type, may be NULL
|
* @param dest_type the destination address type, may be NULL
|
||||||
* @param port the destination port of the media stream, 0 if unknown
|
* @param port the destination port of the media stream, 0 if unknown
|
||||||
* @param ttl the time to live of the stream, 0 if not multicast
|
* @param ttl the time to live of the stream, 0 if not multicast
|
||||||
* @param flags the AVFormatContext->flags, modifying the generated SDP
|
* @param fmt the AVFormatContext, which might contain options modifying
|
||||||
|
* the generated SDP
|
||||||
*/
|
*/
|
||||||
void ff_sdp_write_media(char *buff, int size, AVCodecContext *c,
|
void ff_sdp_write_media(char *buff, int size, AVCodecContext *c,
|
||||||
const char *dest_addr, const char *dest_type,
|
const char *dest_addr, const char *dest_type,
|
||||||
int port, int ttl, int flags);
|
int port, int ttl, AVFormatContext *fmt);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a packet to another muxer than the one the user originally
|
* Write a packet to another muxer than the one the user originally
|
||||||
|
@ -1537,8 +1537,9 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
|
|||||||
|
|
||||||
/* adjust first dts according to edit list */
|
/* adjust first dts according to edit list */
|
||||||
if (sc->time_offset && mov->time_scale > 0) {
|
if (sc->time_offset && mov->time_scale > 0) {
|
||||||
int rescaled = sc->time_offset < 0 ? av_rescale(sc->time_offset, sc->time_scale, mov->time_scale) : sc->time_offset;
|
if (sc->time_offset < 0)
|
||||||
current_dts = -rescaled;
|
sc->time_offset = av_rescale(sc->time_offset, sc->time_scale, mov->time_scale);
|
||||||
|
current_dts = -sc->time_offset;
|
||||||
if (sc->ctts_data && sc->stts_data &&
|
if (sc->ctts_data && sc->stts_data &&
|
||||||
sc->ctts_data[0].duration / FFMAX(sc->stts_data[0].duration, 1) > 16) {
|
sc->ctts_data[0].duration / FFMAX(sc->stts_data[0].duration, 1) > 16) {
|
||||||
/* more than 16 frames delay, dts are likely wrong
|
/* more than 16 frames delay, dts are likely wrong
|
||||||
@ -2072,7 +2073,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
|||||||
|
|
||||||
if (flags & 0x001) data_offset = avio_rb32(pb);
|
if (flags & 0x001) data_offset = avio_rb32(pb);
|
||||||
if (flags & 0x004) first_sample_flags = avio_rb32(pb);
|
if (flags & 0x004) first_sample_flags = avio_rb32(pb);
|
||||||
dts = st->duration;
|
dts = st->duration - sc->time_offset;
|
||||||
offset = frag->base_data_offset + data_offset;
|
offset = frag->base_data_offset + data_offset;
|
||||||
distance = 0;
|
distance = 0;
|
||||||
av_dlog(c->fc, "first sample flags 0x%x\n", first_sample_flags);
|
av_dlog(c->fc, "first sample flags 0x%x\n", first_sample_flags);
|
||||||
@ -2101,7 +2102,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
|||||||
offset += sample_size;
|
offset += sample_size;
|
||||||
}
|
}
|
||||||
frag->moof_offset = offset;
|
frag->moof_offset = offset;
|
||||||
st->duration = dts;
|
st->duration = dts + sc->time_offset;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include "libavutil/avstring.h"
|
#include "libavutil/avstring.h"
|
||||||
#include "libavutil/opt.h"
|
#include "libavutil/opt.h"
|
||||||
#include "libavutil/dict.h"
|
#include "libavutil/dict.h"
|
||||||
|
#include "rtpenc.h"
|
||||||
|
|
||||||
#undef NDEBUG
|
#undef NDEBUG
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -41,6 +42,7 @@
|
|||||||
static const AVOption options[] = {
|
static const AVOption options[] = {
|
||||||
{ "movflags", "MOV muxer flags", offsetof(MOVMuxContext, flags), FF_OPT_TYPE_FLAGS, {.dbl = 0}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
|
{ "movflags", "MOV muxer flags", offsetof(MOVMuxContext, flags), FF_OPT_TYPE_FLAGS, {.dbl = 0}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
|
||||||
{ "rtphint", "Add RTP hint tracks", 0, FF_OPT_TYPE_CONST, {.dbl = FF_MOV_FLAG_RTP_HINT}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
|
{ "rtphint", "Add RTP hint tracks", 0, FF_OPT_TYPE_CONST, {.dbl = FF_MOV_FLAG_RTP_HINT}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
|
||||||
|
FF_RTP_FLAG_OPTS(MOVMuxContext, rtp_flags),
|
||||||
{ NULL },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1368,7 +1370,7 @@ static int mov_write_udta_sdp(AVIOContext *pb, AVFormatContext *ctx, int index)
|
|||||||
char buf[1000] = "";
|
char buf[1000] = "";
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
ff_sdp_write_media(buf, sizeof(buf), ctx->streams[0]->codec, NULL, NULL, 0, 0, ctx->flags);
|
ff_sdp_write_media(buf, sizeof(buf), ctx->streams[0]->codec, NULL, NULL, 0, 0, ctx);
|
||||||
av_strlcatf(buf, sizeof(buf), "a=control:streamid=%d\r\n", index);
|
av_strlcatf(buf, sizeof(buf), "a=control:streamid=%d\r\n", index);
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
|
|
||||||
|
@ -111,6 +111,7 @@ typedef struct MOVMuxContext {
|
|||||||
MOVTrack *tracks;
|
MOVTrack *tracks;
|
||||||
|
|
||||||
int flags;
|
int flags;
|
||||||
|
int rtp_flags;
|
||||||
} MOVMuxContext;
|
} MOVMuxContext;
|
||||||
|
|
||||||
#define FF_MOV_FLAG_RTP_HINT 1
|
#define FF_MOV_FLAG_RTP_HINT 1
|
||||||
|
@ -23,8 +23,6 @@
|
|||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "mpeg.h"
|
#include "mpeg.h"
|
||||||
|
|
||||||
//#define DEBUG_SEEK
|
|
||||||
|
|
||||||
#undef NDEBUG
|
#undef NDEBUG
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
@ -592,9 +590,7 @@ static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
|
|||||||
for(;;) {
|
for(;;) {
|
||||||
len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
|
len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "none (ret=%d)\n", len);
|
||||||
av_log(s, AV_LOG_DEBUG, "none (ret=%d)\n", len);
|
|
||||||
#endif
|
|
||||||
return AV_NOPTS_VALUE;
|
return AV_NOPTS_VALUE;
|
||||||
}
|
}
|
||||||
if (startcode == s->streams[stream_index]->id &&
|
if (startcode == s->streams[stream_index]->id &&
|
||||||
@ -603,10 +599,8 @@ static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
|
|||||||
}
|
}
|
||||||
avio_skip(s->pb, len);
|
avio_skip(s->pb, len);
|
||||||
}
|
}
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n",
|
||||||
av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n",
|
|
||||||
pos, dts, dts / 90000.0);
|
pos, dts, dts / 90000.0);
|
||||||
#endif
|
|
||||||
*ppos = pos;
|
*ppos = pos;
|
||||||
return dts;
|
return dts;
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
#include "mpeg.h"
|
#include "mpeg.h"
|
||||||
|
|
||||||
#define MAX_PAYLOAD_SIZE 4096
|
#define MAX_PAYLOAD_SIZE 4096
|
||||||
//#define DEBUG_SEEK
|
|
||||||
|
|
||||||
#undef NDEBUG
|
#undef NDEBUG
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
@ -19,8 +19,6 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//#define DEBUG
|
|
||||||
//#define DEBUG_SEEK
|
|
||||||
//#define USE_SYNCPOINT_SEARCH
|
//#define USE_SYNCPOINT_SEARCH
|
||||||
|
|
||||||
#include "libavutil/crc.h"
|
#include "libavutil/crc.h"
|
||||||
|
@ -22,9 +22,7 @@
|
|||||||
#include "riff.h"
|
#include "riff.h"
|
||||||
#include "libavutil/dict.h"
|
#include "libavutil/dict.h"
|
||||||
|
|
||||||
//#define DEBUG
|
|
||||||
//#define DEBUG_DUMP_INDEX // XXX dumbdriving-271.nsv breaks with it commented!!
|
//#define DEBUG_DUMP_INDEX // XXX dumbdriving-271.nsv breaks with it commented!!
|
||||||
//#define DEBUG_SEEK
|
|
||||||
#define CHECK_SUBSEQUENT_NSVS
|
#define CHECK_SUBSEQUENT_NSVS
|
||||||
//#define DISABLE_AUDIO
|
//#define DISABLE_AUDIO
|
||||||
|
|
||||||
|
@ -23,11 +23,24 @@
|
|||||||
#include "mpegts.h"
|
#include "mpegts.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "libavutil/random_seed.h"
|
#include "libavutil/random_seed.h"
|
||||||
|
#include "libavutil/opt.h"
|
||||||
|
|
||||||
#include "rtpenc.h"
|
#include "rtpenc.h"
|
||||||
|
|
||||||
//#define DEBUG
|
//#define DEBUG
|
||||||
|
|
||||||
|
static const AVOption options[] = {
|
||||||
|
FF_RTP_FLAG_OPTS(RTPMuxContext, flags),
|
||||||
|
{ NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const AVClass rtp_muxer_class = {
|
||||||
|
.class_name = "RTP muxer",
|
||||||
|
.item_name = av_default_item_name,
|
||||||
|
.option = options,
|
||||||
|
.version = LIBAVUTIL_VERSION_INT,
|
||||||
|
};
|
||||||
|
|
||||||
#define RTCP_SR_SIZE 28
|
#define RTCP_SR_SIZE 28
|
||||||
|
|
||||||
static int is_supported(enum CodecID id)
|
static int is_supported(enum CodecID id)
|
||||||
@ -404,7 +417,7 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
|
|||||||
ff_rtp_send_mpegvideo(s1, pkt->data, size);
|
ff_rtp_send_mpegvideo(s1, pkt->data, size);
|
||||||
break;
|
break;
|
||||||
case CODEC_ID_AAC:
|
case CODEC_ID_AAC:
|
||||||
if (s1->flags & AVFMT_FLAG_MP4A_LATM)
|
if (s->flags & FF_RTP_FLAG_MP4A_LATM)
|
||||||
ff_rtp_send_latm(s1, pkt->data, size);
|
ff_rtp_send_latm(s1, pkt->data, size);
|
||||||
else
|
else
|
||||||
ff_rtp_send_aac(s1, pkt->data, size);
|
ff_rtp_send_aac(s1, pkt->data, size);
|
||||||
@ -458,4 +471,5 @@ AVOutputFormat ff_rtp_muxer = {
|
|||||||
rtp_write_header,
|
rtp_write_header,
|
||||||
rtp_write_packet,
|
rtp_write_packet,
|
||||||
rtp_write_trailer,
|
rtp_write_trailer,
|
||||||
|
.priv_class = &rtp_muxer_class,
|
||||||
};
|
};
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "rtp.h"
|
#include "rtp.h"
|
||||||
|
|
||||||
struct RTPMuxContext {
|
struct RTPMuxContext {
|
||||||
|
const AVClass *av_class;
|
||||||
AVFormatContext *ic;
|
AVFormatContext *ic;
|
||||||
AVStream *st;
|
AVStream *st;
|
||||||
int payload_type;
|
int payload_type;
|
||||||
@ -56,10 +57,18 @@ struct RTPMuxContext {
|
|||||||
* (1, 2 or 4)
|
* (1, 2 or 4)
|
||||||
*/
|
*/
|
||||||
int nal_length_size;
|
int nal_length_size;
|
||||||
|
|
||||||
|
int flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct RTPMuxContext RTPMuxContext;
|
typedef struct RTPMuxContext RTPMuxContext;
|
||||||
|
|
||||||
|
#define FF_RTP_FLAG_MP4A_LATM 1
|
||||||
|
|
||||||
|
#define FF_RTP_FLAG_OPTS(ctx, fieldname) \
|
||||||
|
{ "rtpflags", "RTP muxer flags", offsetof(ctx, fieldname), FF_OPT_TYPE_FLAGS, {.dbl = 0}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "rtpflags" }, \
|
||||||
|
{ "latm", "Use MP4A-LATM packetization instead of MPEG4-GENERIC for AAC", 0, FF_OPT_TYPE_CONST, {.dbl = FF_RTP_FLAG_MP4A_LATM}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "rtpflags" } \
|
||||||
|
|
||||||
void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m);
|
void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m);
|
||||||
|
|
||||||
void ff_rtp_send_h264(AVFormatContext *s1, const uint8_t *buf1, int size);
|
void ff_rtp_send_h264(AVFormatContext *s1, const uint8_t *buf1, int size);
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "avio_internal.h"
|
#include "avio_internal.h"
|
||||||
#include "rtpenc_chain.h"
|
#include "rtpenc_chain.h"
|
||||||
#include "avio_internal.h"
|
#include "avio_internal.h"
|
||||||
|
#include "libavutil/opt.h"
|
||||||
|
|
||||||
AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st,
|
AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st,
|
||||||
URLContext *handle, int packet_size)
|
URLContext *handle, int packet_size)
|
||||||
@ -50,6 +51,13 @@ AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st,
|
|||||||
rtpctx->streams[0]->sample_aspect_ratio = st->sample_aspect_ratio;
|
rtpctx->streams[0]->sample_aspect_ratio = st->sample_aspect_ratio;
|
||||||
rtpctx->flags |= s->flags & AVFMT_FLAG_MP4A_LATM;
|
rtpctx->flags |= s->flags & AVFMT_FLAG_MP4A_LATM;
|
||||||
|
|
||||||
|
av_set_parameters(rtpctx, NULL);
|
||||||
|
/* Copy the rtpflags values straight through */
|
||||||
|
if (s->oformat->priv_class &&
|
||||||
|
av_find_opt(s->priv_data, "rtpflags", NULL, 0, 0))
|
||||||
|
av_set_int(rtpctx->priv_data, "rtpflags",
|
||||||
|
av_get_int(s->priv_data, "rtpflags", NULL));
|
||||||
|
|
||||||
/* Set the synchronized start time. */
|
/* Set the synchronized start time. */
|
||||||
rtpctx->start_time_realtime = s->start_time_realtime;
|
rtpctx->start_time_realtime = s->start_time_realtime;
|
||||||
|
|
||||||
|
@ -22,7 +22,8 @@
|
|||||||
#include "avformat.h"
|
#include "avformat.h"
|
||||||
#include "rtpenc.h"
|
#include "rtpenc.h"
|
||||||
|
|
||||||
void ff_rtp_send_latm(AVFormatContext *s1, const uint8_t *buff, int size) {
|
void ff_rtp_send_latm(AVFormatContext *s1, const uint8_t *buff, int size)
|
||||||
|
{
|
||||||
/* MP4A-LATM
|
/* MP4A-LATM
|
||||||
* The RTP payload format specification is described in RFC 3016
|
* The RTP payload format specification is described in RFC 3016
|
||||||
* The encoding specifications are provided in ISO/IEC 14496-3 */
|
* The encoding specifications are provided in ISO/IEC 14496-3 */
|
||||||
|
@ -344,6 +344,11 @@ typedef struct RTSPState {
|
|||||||
* Do not begin to play the stream immediately.
|
* Do not begin to play the stream immediately.
|
||||||
*/
|
*/
|
||||||
int initial_pause;
|
int initial_pause;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Option flags for the chained RTP muxer.
|
||||||
|
*/
|
||||||
|
int rtp_muxer_flags;
|
||||||
} RTSPState;
|
} RTSPState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,9 +33,23 @@
|
|||||||
#include "libavutil/intreadwrite.h"
|
#include "libavutil/intreadwrite.h"
|
||||||
#include "libavutil/avstring.h"
|
#include "libavutil/avstring.h"
|
||||||
#include "url.h"
|
#include "url.h"
|
||||||
|
#include "libavutil/opt.h"
|
||||||
|
#include "rtpenc.h"
|
||||||
|
|
||||||
#define SDP_MAX_SIZE 16384
|
#define SDP_MAX_SIZE 16384
|
||||||
|
|
||||||
|
static const AVOption options[] = {
|
||||||
|
FF_RTP_FLAG_OPTS(RTSPState, rtp_muxer_flags),
|
||||||
|
{ NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const AVClass rtsp_muxer_class = {
|
||||||
|
.class_name = "RTSP muxer",
|
||||||
|
.item_name = av_default_item_name,
|
||||||
|
.option = options,
|
||||||
|
.version = LIBAVUTIL_VERSION_INT,
|
||||||
|
};
|
||||||
|
|
||||||
int ff_rtsp_setup_output_streams(AVFormatContext *s, const char *addr)
|
int ff_rtsp_setup_output_streams(AVFormatContext *s, const char *addr)
|
||||||
{
|
{
|
||||||
RTSPState *rt = s->priv_data;
|
RTSPState *rt = s->priv_data;
|
||||||
@ -238,5 +252,6 @@ AVOutputFormat ff_rtsp_muxer = {
|
|||||||
rtsp_write_packet,
|
rtsp_write_packet,
|
||||||
rtsp_write_close,
|
rtsp_write_close,
|
||||||
.flags = AVFMT_NOFILE | AVFMT_GLOBALHEADER,
|
.flags = AVFMT_NOFILE | AVFMT_GLOBALHEADER,
|
||||||
|
.priv_class = &rtsp_muxer_class,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "libavutil/base64.h"
|
#include "libavutil/base64.h"
|
||||||
#include "libavutil/dict.h"
|
#include "libavutil/dict.h"
|
||||||
#include "libavutil/parseutils.h"
|
#include "libavutil/parseutils.h"
|
||||||
|
#include "libavutil/opt.h"
|
||||||
#include "libavcodec/xiph.h"
|
#include "libavcodec/xiph.h"
|
||||||
#include "libavcodec/mpeg4audio.h"
|
#include "libavcodec/mpeg4audio.h"
|
||||||
#include "avformat.h"
|
#include "avformat.h"
|
||||||
@ -301,7 +302,8 @@ xiph_fail:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int latm_context2profilelevel(AVCodecContext *c) {
|
static int latm_context2profilelevel(AVCodecContext *c)
|
||||||
|
{
|
||||||
/* MP4A-LATM
|
/* MP4A-LATM
|
||||||
* The RTP payload format specification is described in RFC 3016
|
* The RTP payload format specification is described in RFC 3016
|
||||||
* The encoding specifications are provided in ISO/IEC 14496-3 */
|
* The encoding specifications are provided in ISO/IEC 14496-3 */
|
||||||
@ -329,7 +331,8 @@ static int latm_context2profilelevel(AVCodecContext *c) {
|
|||||||
return profile_level;
|
return profile_level;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *latm_context2config(AVCodecContext *c) {
|
static char *latm_context2config(AVCodecContext *c)
|
||||||
|
{
|
||||||
/* MP4A-LATM
|
/* MP4A-LATM
|
||||||
* The RTP payload format specification is described in RFC 3016
|
* The RTP payload format specification is described in RFC 3016
|
||||||
* The encoding specifications are provided in ISO/IEC 14496-3 */
|
* The encoding specifications are provided in ISO/IEC 14496-3 */
|
||||||
@ -364,7 +367,7 @@ static char *latm_context2config(AVCodecContext *c) {
|
|||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c, int payload_type, int flags)
|
static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c, int payload_type, AVFormatContext *fmt)
|
||||||
{
|
{
|
||||||
char *config = NULL;
|
char *config = NULL;
|
||||||
|
|
||||||
@ -399,7 +402,8 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c,
|
|||||||
payload_type, config ? config : "");
|
payload_type, config ? config : "");
|
||||||
break;
|
break;
|
||||||
case CODEC_ID_AAC:
|
case CODEC_ID_AAC:
|
||||||
if (flags & AVFMT_FLAG_MP4A_LATM) {
|
if (fmt && fmt->oformat->priv_class &&
|
||||||
|
av_opt_flag_is_set(fmt->priv_data, "rtpflags", "latm")) {
|
||||||
config = latm_context2config(c);
|
config = latm_context2config(c);
|
||||||
if (!config)
|
if (!config)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -523,7 +527,7 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c,
|
|||||||
return buff;
|
return buff;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *dest_addr, const char *dest_type, int port, int ttl, int flags)
|
void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *dest_addr, const char *dest_type, int port, int ttl, AVFormatContext *fmt)
|
||||||
{
|
{
|
||||||
const char *type;
|
const char *type;
|
||||||
int payload_type;
|
int payload_type;
|
||||||
@ -546,7 +550,7 @@ void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *des
|
|||||||
av_strlcatf(buff, size, "b=AS:%d\r\n", c->bit_rate / 1000);
|
av_strlcatf(buff, size, "b=AS:%d\r\n", c->bit_rate / 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
sdp_write_media_attributes(buff, size, c, payload_type, flags);
|
sdp_write_media_attributes(buff, size, c, payload_type, fmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size)
|
int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size)
|
||||||
@ -596,7 +600,7 @@ int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size)
|
|||||||
ff_sdp_write_media(buf, size,
|
ff_sdp_write_media(buf, size,
|
||||||
ac[i]->streams[j]->codec, dst[0] ? dst : NULL,
|
ac[i]->streams[j]->codec, dst[0] ? dst : NULL,
|
||||||
dst_type, (port > 0) ? port + j * 2 : 0, ttl,
|
dst_type, (port > 0) ? port + j * 2 : 0, ttl,
|
||||||
ac[i]->flags);
|
ac[i]);
|
||||||
if (port <= 0) {
|
if (port <= 0) {
|
||||||
av_strlcatf(buf, size,
|
av_strlcatf(buf, size,
|
||||||
"a=control:streamid=%d\r\n", i + j);
|
"a=control:streamid=%d\r\n", i + j);
|
||||||
@ -612,7 +616,7 @@ int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size)
|
|||||||
return AVERROR(ENOSYS);
|
return AVERROR(ENOSYS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *dest_addr, const char *dest_type, int port, int ttl, int flags)
|
void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *dest_addr, const char *dest_type, int port, int ttl, AVFormatContext *fmt)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1449,8 +1449,6 @@ int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
|
|||||||
wanted_timestamp, flags);
|
wanted_timestamp, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEBUG_SEEK
|
|
||||||
|
|
||||||
int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
|
int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){
|
||||||
AVInputFormat *avif= s->iformat;
|
AVInputFormat *avif= s->iformat;
|
||||||
int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
|
int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
|
||||||
@ -1462,9 +1460,7 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts
|
|||||||
if (stream_index < 0)
|
if (stream_index < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
|
||||||
av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ts_max=
|
ts_max=
|
||||||
ts_min= AV_NOPTS_VALUE;
|
ts_min= AV_NOPTS_VALUE;
|
||||||
@ -1481,10 +1477,8 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts
|
|||||||
if(e->timestamp <= target_ts || e->pos == e->min_distance){
|
if(e->timestamp <= target_ts || e->pos == e->min_distance){
|
||||||
pos_min= e->pos;
|
pos_min= e->pos;
|
||||||
ts_min= e->timestamp;
|
ts_min= e->timestamp;
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
|
||||||
av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n",
|
|
||||||
pos_min,ts_min);
|
pos_min,ts_min);
|
||||||
#endif
|
|
||||||
}else{
|
}else{
|
||||||
assert(index==0);
|
assert(index==0);
|
||||||
}
|
}
|
||||||
@ -1497,10 +1491,8 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts
|
|||||||
pos_max= e->pos;
|
pos_max= e->pos;
|
||||||
ts_max= e->timestamp;
|
ts_max= e->timestamp;
|
||||||
pos_limit= pos_max - e->min_distance;
|
pos_limit= pos_max - e->min_distance;
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
|
||||||
av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n",
|
|
||||||
pos_max,pos_limit, ts_max);
|
pos_max,pos_limit, ts_max);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1522,9 +1514,7 @@ int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, i
|
|||||||
int64_t start_pos, filesize;
|
int64_t start_pos, filesize;
|
||||||
int no_change;
|
int no_change;
|
||||||
|
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
|
||||||
av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(ts_min == AV_NOPTS_VALUE){
|
if(ts_min == AV_NOPTS_VALUE){
|
||||||
pos_min = s->data_offset;
|
pos_min = s->data_offset;
|
||||||
@ -1566,11 +1556,8 @@ int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, i
|
|||||||
|
|
||||||
no_change=0;
|
no_change=0;
|
||||||
while (pos_min < pos_limit) {
|
while (pos_min < pos_limit) {
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
|
||||||
av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n",
|
pos_min, pos_max, ts_min, ts_max);
|
||||||
pos_min, pos_max,
|
|
||||||
ts_min, ts_max);
|
|
||||||
#endif
|
|
||||||
assert(pos_limit <= pos_max);
|
assert(pos_limit <= pos_max);
|
||||||
|
|
||||||
if(no_change==0){
|
if(no_change==0){
|
||||||
@ -1597,11 +1584,9 @@ int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, i
|
|||||||
no_change++;
|
no_change++;
|
||||||
else
|
else
|
||||||
no_change=0;
|
no_change=0;
|
||||||
#ifdef DEBUG_SEEK
|
av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
|
||||||
av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n",
|
pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts,
|
||||||
pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit,
|
pos_limit, start_pos, no_change);
|
||||||
start_pos, no_change);
|
|
||||||
#endif
|
|
||||||
if(ts == AV_NOPTS_VALUE){
|
if(ts == AV_NOPTS_VALUE){
|
||||||
av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
|
av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
|
||||||
return -1;
|
return -1;
|
||||||
@ -1620,12 +1605,12 @@ int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, i
|
|||||||
|
|
||||||
pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
|
pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
|
||||||
ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
|
ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
|
||||||
#ifdef DEBUG_SEEK
|
#if 1
|
||||||
pos_min = pos;
|
pos_min = pos;
|
||||||
ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
|
ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
|
||||||
pos_min++;
|
pos_min++;
|
||||||
ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
|
ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
|
||||||
av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
|
av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n",
|
||||||
pos, ts_min, target_ts, ts_max);
|
pos, ts_min, target_ts, ts_max);
|
||||||
#endif
|
#endif
|
||||||
*ts_ret= ts;
|
*ts_ret= ts;
|
||||||
@ -2694,9 +2679,7 @@ AVProgram *av_new_program(AVFormatContext *ac, int id)
|
|||||||
AVProgram *program=NULL;
|
AVProgram *program=NULL;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#ifdef DEBUG_SI
|
av_dlog(ac, "new_program: id=0x%04x\n", id);
|
||||||
av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for(i=0; i<ac->nb_programs; i++)
|
for(i=0; i<ac->nb_programs; i++)
|
||||||
if(ac->programs[i]->id == id)
|
if(ac->programs[i]->id == id)
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_MAJOR 53
|
#define LIBAVFORMAT_VERSION_MAJOR 53
|
||||||
#define LIBAVFORMAT_VERSION_MINOR 3
|
#define LIBAVFORMAT_VERSION_MINOR 3
|
||||||
#define LIBAVFORMAT_VERSION_MICRO 0
|
#define LIBAVFORMAT_VERSION_MICRO 1
|
||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||||
LIBAVFORMAT_VERSION_MINOR, \
|
LIBAVFORMAT_VERSION_MINOR, \
|
||||||
|
@ -320,6 +320,16 @@ int64_t av_get_int(void *obj, const char *name, const AVOption **o_out)
|
|||||||
return num*intnum/den;
|
return num*intnum/den;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name)
|
||||||
|
{
|
||||||
|
const AVOption *field = av_find_opt(obj, field_name, NULL, 0, 0);
|
||||||
|
const AVOption *flag = av_find_opt(obj, flag_name, NULL, 0, 0);
|
||||||
|
|
||||||
|
if (!field || !flag || flag->type != FF_OPT_TYPE_CONST)
|
||||||
|
return 0;
|
||||||
|
return av_get_int(obj, field_name, NULL) & (int) flag->default_val.dbl;
|
||||||
|
}
|
||||||
|
|
||||||
static void opt_list(void *obj, void *av_log_obj, const char *unit,
|
static void opt_list(void *obj, void *av_log_obj, const char *unit,
|
||||||
int req_flags, int rej_flags)
|
int req_flags, int rej_flags)
|
||||||
{
|
{
|
||||||
|
@ -181,4 +181,14 @@ int av_set_options_string(void *ctx, const char *opts,
|
|||||||
*/
|
*/
|
||||||
void av_opt_free(void *obj);
|
void av_opt_free(void *obj);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether a particular flag is set in a flags field.
|
||||||
|
*
|
||||||
|
* @param field_name the name of the flag field option
|
||||||
|
* @param flag_name the name of the flag to check
|
||||||
|
* @return non-zero if the flag is set, zero if the flag isn't set,
|
||||||
|
* isn't of the right type, or the flags field doesn't exist.
|
||||||
|
*/
|
||||||
|
int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name);
|
||||||
|
|
||||||
#endif /* AVUTIL_OPT_H */
|
#endif /* AVUTIL_OPT_H */
|
||||||
|
@ -878,6 +878,52 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = {
|
|||||||
},
|
},
|
||||||
.flags = PIX_FMT_BE,
|
.flags = PIX_FMT_BE,
|
||||||
},
|
},
|
||||||
|
[PIX_FMT_YUV444P10LE] = {
|
||||||
|
.name = "yuv444p10le",
|
||||||
|
.nb_components= 3,
|
||||||
|
.log2_chroma_w= 0,
|
||||||
|
.log2_chroma_h= 0,
|
||||||
|
.comp = {
|
||||||
|
{0,1,1,0,9}, /* Y */
|
||||||
|
{1,1,1,0,9}, /* U */
|
||||||
|
{2,1,1,0,9}, /* V */
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[PIX_FMT_YUV444P10BE] = {
|
||||||
|
.name = "yuv444p10be",
|
||||||
|
.nb_components= 3,
|
||||||
|
.log2_chroma_w= 0,
|
||||||
|
.log2_chroma_h= 0,
|
||||||
|
.comp = {
|
||||||
|
{0,1,1,0,9}, /* Y */
|
||||||
|
{1,1,1,0,9}, /* U */
|
||||||
|
{2,1,1,0,9}, /* V */
|
||||||
|
},
|
||||||
|
.flags = PIX_FMT_BE,
|
||||||
|
},
|
||||||
|
[PIX_FMT_YUV444P9LE] = {
|
||||||
|
.name = "yuv444p9le",
|
||||||
|
.nb_components= 3,
|
||||||
|
.log2_chroma_w= 0,
|
||||||
|
.log2_chroma_h= 0,
|
||||||
|
.comp = {
|
||||||
|
{0,1,1,0,8}, /* Y */
|
||||||
|
{1,1,1,0,8}, /* U */
|
||||||
|
{2,1,1,0,8}, /* V */
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[PIX_FMT_YUV444P9BE] = {
|
||||||
|
.name = "yuv444p9be",
|
||||||
|
.nb_components= 3,
|
||||||
|
.log2_chroma_w= 0,
|
||||||
|
.log2_chroma_h= 0,
|
||||||
|
.comp = {
|
||||||
|
{0,1,1,0,9}, /* Y */
|
||||||
|
{1,1,1,0,9}, /* U */
|
||||||
|
{2,1,1,0,9}, /* V */
|
||||||
|
},
|
||||||
|
.flags = PIX_FMT_BE,
|
||||||
|
},
|
||||||
[PIX_FMT_DXVA2_VLD] = {
|
[PIX_FMT_DXVA2_VLD] = {
|
||||||
.name = "dxva2_vld",
|
.name = "dxva2_vld",
|
||||||
.log2_chroma_w = 1,
|
.log2_chroma_w = 1,
|
||||||
|
@ -136,15 +136,19 @@ enum PixelFormat {
|
|||||||
PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
|
PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
|
||||||
PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
|
PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
|
||||||
|
|
||||||
//the following 6 formats have the disadvantage of needing 1 format for each bit depth, thus
|
//the following 10 formats have the disadvantage of needing 1 format for each bit depth, thus
|
||||||
//If you want to support multiple bit depths, then using PIX_FMT_YUV420P16* with the bpp stored seperately
|
//If you want to support multiple bit depths, then using PIX_FMT_YUV420P16* with the bpp stored seperately
|
||||||
//is better
|
//is better
|
||||||
PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
|
PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
|
||||||
PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
|
PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
|
||||||
PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
|
PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
|
||||||
PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
|
PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
|
||||||
PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
|
PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
|
||||||
PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
|
PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
|
||||||
|
PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
|
||||||
|
PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
|
||||||
|
PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
|
||||||
|
PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
|
||||||
|
|
||||||
PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
|
PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
|
||||||
};
|
};
|
||||||
@ -173,8 +177,10 @@ enum PixelFormat {
|
|||||||
#define PIX_FMT_BGR444 PIX_FMT_NE(BGR444BE, BGR444LE)
|
#define PIX_FMT_BGR444 PIX_FMT_NE(BGR444BE, BGR444LE)
|
||||||
|
|
||||||
#define PIX_FMT_YUV420P9 PIX_FMT_NE(YUV420P9BE , YUV420P9LE)
|
#define PIX_FMT_YUV420P9 PIX_FMT_NE(YUV420P9BE , YUV420P9LE)
|
||||||
|
#define PIX_FMT_YUV444P9 PIX_FMT_NE(YUV444P9BE , YUV444P9LE)
|
||||||
#define PIX_FMT_YUV420P10 PIX_FMT_NE(YUV420P10BE, YUV420P10LE)
|
#define PIX_FMT_YUV420P10 PIX_FMT_NE(YUV420P10BE, YUV420P10LE)
|
||||||
#define PIX_FMT_YUV422P10 PIX_FMT_NE(YUV422P10BE, YUV422P10LE)
|
#define PIX_FMT_YUV422P10 PIX_FMT_NE(YUV422P10BE, YUV422P10LE)
|
||||||
|
#define PIX_FMT_YUV444P10 PIX_FMT_NE(YUV444P10BE, YUV444P10LE)
|
||||||
#define PIX_FMT_YUV420P16 PIX_FMT_NE(YUV420P16BE, YUV420P16LE)
|
#define PIX_FMT_YUV420P16 PIX_FMT_NE(YUV420P16BE, YUV420P16LE)
|
||||||
#define PIX_FMT_YUV422P16 PIX_FMT_NE(YUV422P16BE, YUV422P16LE)
|
#define PIX_FMT_YUV422P16 PIX_FMT_NE(YUV422P16BE, YUV422P16LE)
|
||||||
#define PIX_FMT_YUV444P16 PIX_FMT_NE(YUV444P16BE, YUV444P16LE)
|
#define PIX_FMT_YUV444P16 PIX_FMT_NE(YUV444P16BE, YUV444P16LE)
|
||||||
|
@ -724,7 +724,117 @@ yuv2mono_1_c_template(SwsContext *c, const uint16_t *buf0,
|
|||||||
YUV2PACKEDWRAPPER(yuv2mono, white, PIX_FMT_MONOWHITE);
|
YUV2PACKEDWRAPPER(yuv2mono, white, PIX_FMT_MONOWHITE);
|
||||||
YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK);
|
YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK);
|
||||||
|
|
||||||
#define YSCALE_YUV_2_PACKEDX_C(type,alpha) \
|
static av_always_inline void
|
||||||
|
yuv2422_X_c_template(SwsContext *c, const int16_t *lumFilter,
|
||||||
|
const int16_t **lumSrc, int lumFilterSize,
|
||||||
|
const int16_t *chrFilter, const int16_t **chrUSrc,
|
||||||
|
const int16_t **chrVSrc, int chrFilterSize,
|
||||||
|
const int16_t **alpSrc, uint8_t *dest, int dstW,
|
||||||
|
int y, enum PixelFormat target)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
#define output_pixels(pos, Y1, U, Y2, V) \
|
||||||
|
if (target == PIX_FMT_YUYV422) { \
|
||||||
|
dest[pos + 0] = Y1; \
|
||||||
|
dest[pos + 1] = U; \
|
||||||
|
dest[pos + 2] = Y2; \
|
||||||
|
dest[pos + 3] = V; \
|
||||||
|
} else { \
|
||||||
|
dest[pos + 0] = U; \
|
||||||
|
dest[pos + 1] = Y1; \
|
||||||
|
dest[pos + 2] = V; \
|
||||||
|
dest[pos + 3] = Y2; \
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < (dstW >> 1); i++) {
|
||||||
|
int j;
|
||||||
|
int Y1 = 1 << 18;
|
||||||
|
int Y2 = 1 << 18;
|
||||||
|
int U = 1 << 18;
|
||||||
|
int V = 1 << 18;
|
||||||
|
|
||||||
|
for (j = 0; j < lumFilterSize; j++) {
|
||||||
|
Y1 += lumSrc[j][i * 2] * lumFilter[j];
|
||||||
|
Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
|
||||||
|
}
|
||||||
|
for (j = 0; j < chrFilterSize; j++) {
|
||||||
|
U += chrUSrc[j][i] * chrFilter[j];
|
||||||
|
V += chrVSrc[j][i] * chrFilter[j];
|
||||||
|
}
|
||||||
|
Y1 >>= 19;
|
||||||
|
Y2 >>= 19;
|
||||||
|
U >>= 19;
|
||||||
|
V >>= 19;
|
||||||
|
if ((Y1 | Y2 | U | V) & 0x100) {
|
||||||
|
Y1 = av_clip_uint8(Y1);
|
||||||
|
Y2 = av_clip_uint8(Y2);
|
||||||
|
U = av_clip_uint8(U);
|
||||||
|
V = av_clip_uint8(V);
|
||||||
|
}
|
||||||
|
output_pixels(4*i, Y1, U, Y2, V);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static av_always_inline void
|
||||||
|
yuv2422_2_c_template(SwsContext *c, const uint16_t *buf0,
|
||||||
|
const uint16_t *buf1, const uint16_t *ubuf0,
|
||||||
|
const uint16_t *ubuf1, const uint16_t *vbuf0,
|
||||||
|
const uint16_t *vbuf1, const uint16_t *abuf0,
|
||||||
|
const uint16_t *abuf1, uint8_t *dest, int dstW,
|
||||||
|
int yalpha, int uvalpha, int y,
|
||||||
|
enum PixelFormat target)
|
||||||
|
{
|
||||||
|
int yalpha1 = 4095 - yalpha;
|
||||||
|
int uvalpha1 = 4095 - uvalpha;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < (dstW >> 1); i++) {
|
||||||
|
int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
|
||||||
|
int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
|
||||||
|
int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
|
||||||
|
int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
|
||||||
|
|
||||||
|
output_pixels(i * 4, Y1, U, Y2, V);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static av_always_inline void
|
||||||
|
yuv2422_1_c_template(SwsContext *c, const uint16_t *buf0,
|
||||||
|
const uint16_t *ubuf0, const uint16_t *ubuf1,
|
||||||
|
const uint16_t *vbuf0, const uint16_t *vbuf1,
|
||||||
|
const uint16_t *abuf0, uint8_t *dest, int dstW,
|
||||||
|
int uvalpha, enum PixelFormat dstFormat,
|
||||||
|
int flags, int y, enum PixelFormat target)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (uvalpha < 2048) {
|
||||||
|
for (i = 0; i < (dstW >> 1); i++) {
|
||||||
|
int Y1 = buf0[i * 2] >> 7;
|
||||||
|
int Y2 = buf0[i * 2 + 1] >> 7;
|
||||||
|
int U = ubuf1[i] >> 7;
|
||||||
|
int V = vbuf1[i] >> 7;
|
||||||
|
|
||||||
|
output_pixels(i * 4, Y1, U, Y2, V);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = 0; i < (dstW >> 1); i++) {
|
||||||
|
int Y1 = buf0[i * 2] >> 7;
|
||||||
|
int Y2 = buf0[i * 2 + 1] >> 7;
|
||||||
|
int U = (ubuf0[i] + ubuf1[i]) >> 8;
|
||||||
|
int V = (vbuf0[i] + vbuf1[i]) >> 8;
|
||||||
|
|
||||||
|
output_pixels(i * 4, Y1, U, Y2, V);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#undef output_pixels
|
||||||
|
}
|
||||||
|
|
||||||
|
YUV2PACKEDWRAPPER(yuv2422, yuyv, PIX_FMT_YUYV422);
|
||||||
|
YUV2PACKEDWRAPPER(yuv2422, uyvy, PIX_FMT_UYVY422);
|
||||||
|
|
||||||
|
#define YSCALE_YUV_2_RGBX_C(type,alpha) \
|
||||||
for (i=0; i<(dstW>>1); i++) {\
|
for (i=0; i<(dstW>>1); i++) {\
|
||||||
int j;\
|
int j;\
|
||||||
int Y1 = 1<<18;\
|
int Y1 = 1<<18;\
|
||||||
@ -766,7 +876,11 @@ YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK);
|
|||||||
A1 = av_clip_uint8(A1); \
|
A1 = av_clip_uint8(A1); \
|
||||||
A2 = av_clip_uint8(A2); \
|
A2 = av_clip_uint8(A2); \
|
||||||
}\
|
}\
|
||||||
}
|
}\
|
||||||
|
/* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/\
|
||||||
|
r = (type *)c->table_rV[V]; \
|
||||||
|
g = (type *)(c->table_gU[U] + c->table_gV[V]); \
|
||||||
|
b = (type *)c->table_bU[U];
|
||||||
|
|
||||||
#define YSCALE_YUV_2_RGBX_FULL_C(rnd,alpha) \
|
#define YSCALE_YUV_2_RGBX_FULL_C(rnd,alpha) \
|
||||||
for (i=0; i<dstW; i++) {\
|
for (i=0; i<dstW; i++) {\
|
||||||
@ -807,13 +921,7 @@ YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK);
|
|||||||
B = av_clip_uintp2(B, 30); \
|
B = av_clip_uintp2(B, 30); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define YSCALE_YUV_2_RGBX_C(type,alpha) \
|
#define YSCALE_YUV_2_RGB2_C(type,alpha) \
|
||||||
YSCALE_YUV_2_PACKEDX_C(type,alpha) /* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/\
|
|
||||||
r = (type *)c->table_rV[V]; \
|
|
||||||
g = (type *)(c->table_gU[U] + c->table_gV[V]); \
|
|
||||||
b = (type *)c->table_bU[U];
|
|
||||||
|
|
||||||
#define YSCALE_YUV_2_PACKED2_C(type,alpha) \
|
|
||||||
for (i=0; i<(dstW>>1); i++) { \
|
for (i=0; i<(dstW>>1); i++) { \
|
||||||
const int i2= 2*i; \
|
const int i2= 2*i; \
|
||||||
int Y1= (buf0[i2 ]*yalpha1+buf1[i2 ]*yalpha)>>19; \
|
int Y1= (buf0[i2 ]*yalpha1+buf1[i2 ]*yalpha)>>19; \
|
||||||
@ -825,15 +933,12 @@ YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK);
|
|||||||
if (alpha) {\
|
if (alpha) {\
|
||||||
A1= (abuf0[i2 ]*yalpha1+abuf1[i2 ]*yalpha)>>19; \
|
A1= (abuf0[i2 ]*yalpha1+abuf1[i2 ]*yalpha)>>19; \
|
||||||
A2= (abuf0[i2+1]*yalpha1+abuf1[i2+1]*yalpha)>>19; \
|
A2= (abuf0[i2+1]*yalpha1+abuf1[i2+1]*yalpha)>>19; \
|
||||||
}
|
}\
|
||||||
|
|
||||||
#define YSCALE_YUV_2_RGB2_C(type,alpha) \
|
|
||||||
YSCALE_YUV_2_PACKED2_C(type,alpha)\
|
|
||||||
r = (type *)c->table_rV[V];\
|
r = (type *)c->table_rV[V];\
|
||||||
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
|
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
|
||||||
b = (type *)c->table_bU[U];
|
b = (type *)c->table_bU[U];
|
||||||
|
|
||||||
#define YSCALE_YUV_2_PACKED1_C(type,alpha) \
|
#define YSCALE_YUV_2_RGB1_C(type,alpha) \
|
||||||
for (i=0; i<(dstW>>1); i++) {\
|
for (i=0; i<(dstW>>1); i++) {\
|
||||||
const int i2= 2*i;\
|
const int i2= 2*i;\
|
||||||
int Y1= buf0[i2 ]>>7;\
|
int Y1= buf0[i2 ]>>7;\
|
||||||
@ -845,15 +950,12 @@ YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK);
|
|||||||
if (alpha) {\
|
if (alpha) {\
|
||||||
A1= abuf0[i2 ]>>7;\
|
A1= abuf0[i2 ]>>7;\
|
||||||
A2= abuf0[i2+1]>>7;\
|
A2= abuf0[i2+1]>>7;\
|
||||||
}
|
}\
|
||||||
|
|
||||||
#define YSCALE_YUV_2_RGB1_C(type,alpha) \
|
|
||||||
YSCALE_YUV_2_PACKED1_C(type,alpha)\
|
|
||||||
r = (type *)c->table_rV[V];\
|
r = (type *)c->table_rV[V];\
|
||||||
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
|
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
|
||||||
b = (type *)c->table_bU[U];
|
b = (type *)c->table_bU[U];
|
||||||
|
|
||||||
#define YSCALE_YUV_2_PACKED1B_C(type,alpha) \
|
#define YSCALE_YUV_2_RGB1B_C(type,alpha) \
|
||||||
for (i=0; i<(dstW>>1); i++) {\
|
for (i=0; i<(dstW>>1); i++) {\
|
||||||
const int i2= 2*i;\
|
const int i2= 2*i;\
|
||||||
int Y1= buf0[i2 ]>>7;\
|
int Y1= buf0[i2 ]>>7;\
|
||||||
@ -865,15 +967,12 @@ YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK);
|
|||||||
if (alpha) {\
|
if (alpha) {\
|
||||||
A1= abuf0[i2 ]>>7;\
|
A1= abuf0[i2 ]>>7;\
|
||||||
A2= abuf0[i2+1]>>7;\
|
A2= abuf0[i2+1]>>7;\
|
||||||
}
|
}\
|
||||||
|
|
||||||
#define YSCALE_YUV_2_RGB1B_C(type,alpha) \
|
|
||||||
YSCALE_YUV_2_PACKED1B_C(type,alpha)\
|
|
||||||
r = (type *)c->table_rV[V];\
|
r = (type *)c->table_rV[V];\
|
||||||
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
|
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
|
||||||
b = (type *)c->table_bU[U];
|
b = (type *)c->table_bU[U];
|
||||||
|
|
||||||
#define YSCALE_YUV_2_ANYRGB_C(func, func2)\
|
#define YSCALE_YUV_2_ANYRGB_C(func)\
|
||||||
switch(c->dstFormat) {\
|
switch(c->dstFormat) {\
|
||||||
case PIX_FMT_RGB48BE:\
|
case PIX_FMT_RGB48BE:\
|
||||||
case PIX_FMT_RGB48LE:\
|
case PIX_FMT_RGB48LE:\
|
||||||
@ -1049,22 +1148,6 @@ YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK);
|
|||||||
}\
|
}\
|
||||||
}\
|
}\
|
||||||
break;\
|
break;\
|
||||||
case PIX_FMT_YUYV422:\
|
|
||||||
func2\
|
|
||||||
((uint8_t*)dest)[2*i2+0]= Y1;\
|
|
||||||
((uint8_t*)dest)[2*i2+1]= U;\
|
|
||||||
((uint8_t*)dest)[2*i2+2]= Y2;\
|
|
||||||
((uint8_t*)dest)[2*i2+3]= V;\
|
|
||||||
} \
|
|
||||||
break;\
|
|
||||||
case PIX_FMT_UYVY422:\
|
|
||||||
func2\
|
|
||||||
((uint8_t*)dest)[2*i2+0]= U;\
|
|
||||||
((uint8_t*)dest)[2*i2+1]= Y1;\
|
|
||||||
((uint8_t*)dest)[2*i2+2]= V;\
|
|
||||||
((uint8_t*)dest)[2*i2+3]= Y2;\
|
|
||||||
} \
|
|
||||||
break;\
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void yuv2packedX_c(SwsContext *c, const int16_t *lumFilter,
|
static void yuv2packedX_c(SwsContext *c, const int16_t *lumFilter,
|
||||||
@ -1074,7 +1157,7 @@ static void yuv2packedX_c(SwsContext *c, const int16_t *lumFilter,
|
|||||||
const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
|
const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGBX_C, YSCALE_YUV_2_PACKEDX_C(void,0))
|
YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGBX_C)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void yuv2rgbX_c_full(SwsContext *c, const int16_t *lumFilter,
|
static void yuv2rgbX_c_full(SwsContext *c, const int16_t *lumFilter,
|
||||||
@ -1177,7 +1260,7 @@ static void yuv2packed2_c(SwsContext *c, const uint16_t *buf0,
|
|||||||
int uvalpha1=4095-uvalpha;
|
int uvalpha1=4095-uvalpha;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB2_C, YSCALE_YUV_2_PACKED2_C(void,0))
|
YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB2_C)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1193,9 +1276,9 @@ static void yuv2packed1_c(SwsContext *c, const uint16_t *buf0,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (uvalpha < 2048) {
|
if (uvalpha < 2048) {
|
||||||
YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1_C, YSCALE_YUV_2_PACKED1_C(void,0))
|
YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1_C)
|
||||||
} else {
|
} else {
|
||||||
YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1B_C, YSCALE_YUV_2_PACKED1B_C(void,0))
|
YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1B_C)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1886,7 +1969,7 @@ find_c_packed_planar_out_funcs(SwsContext *c,
|
|||||||
} else if (is16BPS(dstFormat)) {
|
} else if (is16BPS(dstFormat)) {
|
||||||
*yuv2yuvX = isBE(dstFormat) ? yuv2yuvX16BE_c : yuv2yuvX16LE_c;
|
*yuv2yuvX = isBE(dstFormat) ? yuv2yuvX16BE_c : yuv2yuvX16LE_c;
|
||||||
} else if (is9_OR_10BPS(dstFormat)) {
|
} else if (is9_OR_10BPS(dstFormat)) {
|
||||||
if (dstFormat == PIX_FMT_YUV420P9BE || dstFormat == PIX_FMT_YUV420P9LE) {
|
if (av_pix_fmt_descriptors[dstFormat].comp[0].depth_minus1 == 8) {
|
||||||
*yuv2yuvX = isBE(dstFormat) ? yuv2yuvX9BE_c : yuv2yuvX9LE_c;
|
*yuv2yuvX = isBE(dstFormat) ? yuv2yuvX9BE_c : yuv2yuvX9LE_c;
|
||||||
} else {
|
} else {
|
||||||
*yuv2yuvX = isBE(dstFormat) ? yuv2yuvX10BE_c : yuv2yuvX10LE_c;
|
*yuv2yuvX = isBE(dstFormat) ? yuv2yuvX10BE_c : yuv2yuvX10LE_c;
|
||||||
@ -1919,6 +2002,16 @@ find_c_packed_planar_out_funcs(SwsContext *c,
|
|||||||
*yuv2packed2 = yuv2monoblack_2_c;
|
*yuv2packed2 = yuv2monoblack_2_c;
|
||||||
*yuv2packedX = yuv2monoblack_X_c;
|
*yuv2packedX = yuv2monoblack_X_c;
|
||||||
break;
|
break;
|
||||||
|
case PIX_FMT_YUYV422:
|
||||||
|
*yuv2packed1 = yuv2422yuyv_1_c;
|
||||||
|
*yuv2packed2 = yuv2422yuyv_2_c;
|
||||||
|
*yuv2packedX = yuv2422yuyv_X_c;
|
||||||
|
break;
|
||||||
|
case PIX_FMT_UYVY422:
|
||||||
|
*yuv2packed1 = yuv2422uyvy_1_c;
|
||||||
|
*yuv2packed2 = yuv2422uyvy_2_c;
|
||||||
|
*yuv2packedX = yuv2422uyvy_X_c;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
*yuv2packed1 = yuv2packed1_c;
|
*yuv2packed1 = yuv2packed1_c;
|
||||||
*yuv2packed2 = yuv2packed2_c;
|
*yuv2packed2 = yuv2packed2_c;
|
||||||
@ -2221,16 +2314,20 @@ static av_cold void sws_init_swScale_c(SwsContext *c)
|
|||||||
case PIX_FMT_BGR4_BYTE:
|
case PIX_FMT_BGR4_BYTE:
|
||||||
case PIX_FMT_RGB4_BYTE: c->chrToYV12 = palToUV_c; break;
|
case PIX_FMT_RGB4_BYTE: c->chrToYV12 = palToUV_c; break;
|
||||||
case PIX_FMT_GRAY16BE :
|
case PIX_FMT_GRAY16BE :
|
||||||
|
case PIX_FMT_YUV444P9BE:
|
||||||
case PIX_FMT_YUV420P9BE:
|
case PIX_FMT_YUV420P9BE:
|
||||||
|
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->hScale16= HAVE_BIGENDIAN ? hScale16_c : hScale16X_c; break;
|
case PIX_FMT_YUV444P16BE: c->hScale16= HAVE_BIGENDIAN ? hScale16_c : hScale16X_c; break;
|
||||||
case PIX_FMT_GRAY16LE :
|
case PIX_FMT_GRAY16LE :
|
||||||
|
case PIX_FMT_YUV444P9LE:
|
||||||
case PIX_FMT_YUV420P9LE:
|
case PIX_FMT_YUV420P9LE:
|
||||||
case PIX_FMT_YUV422P10LE:
|
case PIX_FMT_YUV422P10LE:
|
||||||
case PIX_FMT_YUV420P10LE:
|
case PIX_FMT_YUV420P10LE:
|
||||||
|
case PIX_FMT_YUV444P10LE:
|
||||||
case PIX_FMT_YUV420P16LE:
|
case PIX_FMT_YUV420P16LE:
|
||||||
case PIX_FMT_YUV422P16LE:
|
case PIX_FMT_YUV422P16LE:
|
||||||
case PIX_FMT_YUV444P16LE: c->hScale16= HAVE_BIGENDIAN ? hScale16X_c : hScale16_c; break;
|
case PIX_FMT_YUV444P16LE: c->hScale16= HAVE_BIGENDIAN ? hScale16X_c : hScale16_c; break;
|
||||||
|
@ -371,6 +371,12 @@ const char *sws_format_name(enum PixelFormat format);
|
|||||||
#define isNBPS(x) ( \
|
#define isNBPS(x) ( \
|
||||||
(x)==PIX_FMT_YUV420P9LE \
|
(x)==PIX_FMT_YUV420P9LE \
|
||||||
|| (x)==PIX_FMT_YUV420P9BE \
|
|| (x)==PIX_FMT_YUV420P9BE \
|
||||||
|
|| (x)==PIX_FMT_YUV444P9BE \
|
||||||
|
|| (x)==PIX_FMT_YUV444P9LE \
|
||||||
|
|| (x)==PIX_FMT_YUV422P10BE \
|
||||||
|
|| (x)==PIX_FMT_YUV422P10LE \
|
||||||
|
|| (x)==PIX_FMT_YUV444P10BE \
|
||||||
|
|| (x)==PIX_FMT_YUV444P10LE \
|
||||||
|| (x)==PIX_FMT_YUV420P10LE \
|
|| (x)==PIX_FMT_YUV420P10LE \
|
||||||
|| (x)==PIX_FMT_YUV420P10BE \
|
|| (x)==PIX_FMT_YUV420P10BE \
|
||||||
|| (x)==PIX_FMT_YUV422P10LE \
|
|| (x)==PIX_FMT_YUV422P10LE \
|
||||||
@ -392,13 +398,19 @@ const char *sws_format_name(enum PixelFormat format);
|
|||||||
#define isPlanarYUV(x) ( \
|
#define isPlanarYUV(x) ( \
|
||||||
isPlanar8YUV(x) \
|
isPlanar8YUV(x) \
|
||||||
|| (x)==PIX_FMT_YUV420P9LE \
|
|| (x)==PIX_FMT_YUV420P9LE \
|
||||||
|
|| (x)==PIX_FMT_YUV444P9LE \
|
||||||
|| (x)==PIX_FMT_YUV420P10LE \
|
|| (x)==PIX_FMT_YUV420P10LE \
|
||||||
|
|| (x)==PIX_FMT_YUV422P10LE \
|
||||||
|
|| (x)==PIX_FMT_YUV444P10LE \
|
||||||
|| (x)==PIX_FMT_YUV420P16LE \
|
|| (x)==PIX_FMT_YUV420P16LE \
|
||||||
|| (x)==PIX_FMT_YUV422P10LE \
|
|| (x)==PIX_FMT_YUV422P10LE \
|
||||||
|| (x)==PIX_FMT_YUV422P16LE \
|
|| (x)==PIX_FMT_YUV422P16LE \
|
||||||
|| (x)==PIX_FMT_YUV444P16LE \
|
|| (x)==PIX_FMT_YUV444P16LE \
|
||||||
|| (x)==PIX_FMT_YUV420P9BE \
|
|| (x)==PIX_FMT_YUV420P9BE \
|
||||||
|
|| (x)==PIX_FMT_YUV444P9BE \
|
||||||
|| (x)==PIX_FMT_YUV420P10BE \
|
|| (x)==PIX_FMT_YUV420P10BE \
|
||||||
|
|| (x)==PIX_FMT_YUV422P10BE \
|
||||||
|
|| (x)==PIX_FMT_YUV444P10BE \
|
||||||
|| (x)==PIX_FMT_YUV420P16BE \
|
|| (x)==PIX_FMT_YUV420P16BE \
|
||||||
|| (x)==PIX_FMT_YUV422P10BE \
|
|| (x)==PIX_FMT_YUV422P10BE \
|
||||||
|| (x)==PIX_FMT_YUV422P16BE \
|
|| (x)==PIX_FMT_YUV422P16BE \
|
||||||
|
@ -112,12 +112,18 @@ const char *swscale_license(void)
|
|||||||
|| (x)==PIX_FMT_MONOWHITE \
|
|| (x)==PIX_FMT_MONOWHITE \
|
||||||
|| (x)==PIX_FMT_MONOBLACK \
|
|| (x)==PIX_FMT_MONOBLACK \
|
||||||
|| (x)==PIX_FMT_YUV420P9LE \
|
|| (x)==PIX_FMT_YUV420P9LE \
|
||||||
|
|| (x)==PIX_FMT_YUV444P9LE \
|
||||||
|| (x)==PIX_FMT_YUV420P10LE \
|
|| (x)==PIX_FMT_YUV420P10LE \
|
||||||
|
|| (x)==PIX_FMT_YUV422P10LE \
|
||||||
|
|| (x)==PIX_FMT_YUV444P10LE \
|
||||||
|| (x)==PIX_FMT_YUV420P16LE \
|
|| (x)==PIX_FMT_YUV420P16LE \
|
||||||
|| (x)==PIX_FMT_YUV422P16LE \
|
|| (x)==PIX_FMT_YUV422P16LE \
|
||||||
|| (x)==PIX_FMT_YUV444P16LE \
|
|| (x)==PIX_FMT_YUV444P16LE \
|
||||||
|| (x)==PIX_FMT_YUV420P9BE \
|
|| (x)==PIX_FMT_YUV420P9BE \
|
||||||
|
|| (x)==PIX_FMT_YUV444P9BE \
|
||||||
|| (x)==PIX_FMT_YUV420P10BE \
|
|| (x)==PIX_FMT_YUV420P10BE \
|
||||||
|
|| (x)==PIX_FMT_YUV444P10BE \
|
||||||
|
|| (x)==PIX_FMT_YUV422P10BE \
|
||||||
|| (x)==PIX_FMT_YUV420P16BE \
|
|| (x)==PIX_FMT_YUV420P16BE \
|
||||||
|| (x)==PIX_FMT_YUV422P16BE \
|
|| (x)==PIX_FMT_YUV422P16BE \
|
||||||
|| (x)==PIX_FMT_YUV444P16BE \
|
|| (x)==PIX_FMT_YUV444P16BE \
|
||||||
|
Loading…
Reference in New Issue
Block a user