lavc: export DV profile API used by muxer/demuxer as public

pull/76/head
Anton Khirnov 11 years ago
parent 3f3232a371
commit f6ee61fb05
  1. 7
      configure
  2. 3
      doc/APIchanges
  3. 8
      libavcodec/Makefile
  4. 4
      libavcodec/dv.c
  5. 6
      libavcodec/dv.h
  6. 57
      libavcodec/dv_profile.c
  7. 29
      libavcodec/dv_profile.h
  8. 27
      libavcodec/dv_profile_internal.h
  9. 2
      libavcodec/dvdec.c
  10. 1
      libavcodec/dvenc.c
  11. 4
      libavcodec/version.h
  12. 15
      libavformat/dv.c
  13. 6
      libavformat/dvenc.c

7
configure vendored

@ -1534,6 +1534,7 @@ CONFIG_EXTRA="
bswapdsp bswapdsp
cabac cabac
dsputil dsputil
dvprofile
fdctdsp fdctdsp
gcrypt gcrypt
golomb golomb
@ -1749,8 +1750,8 @@ cscd_decoder_suggest="zlib"
dca_decoder_select="mdct" dca_decoder_select="mdct"
dnxhd_decoder_select="blockdsp idctdsp" dnxhd_decoder_select="blockdsp idctdsp"
dnxhd_encoder_select="aandcttables blockdsp dsputil fdctdsp idctdsp mpegvideoenc" dnxhd_encoder_select="aandcttables blockdsp dsputil fdctdsp idctdsp mpegvideoenc"
dvvideo_decoder_select="idctdsp" dvvideo_decoder_select="dvprofile idctdsp"
dvvideo_encoder_select="dsputil fdctdsp" dvvideo_encoder_select="dsputil dvprofile fdctdsp"
dxa_decoder_deps="zlib" dxa_decoder_deps="zlib"
eac3_decoder_select="ac3_decoder" eac3_decoder_select="ac3_decoder"
eac3_encoder_select="ac3_encoder" eac3_encoder_select="ac3_encoder"
@ -2007,6 +2008,8 @@ avisynth_demuxer_deps="avisynth"
avisynth_demuxer_select="riffdec" avisynth_demuxer_select="riffdec"
caf_demuxer_select="riffdec" caf_demuxer_select="riffdec"
dirac_demuxer_select="dirac_parser" dirac_demuxer_select="dirac_parser"
dv_demuxer_select="dvprofile"
dv_muxer_select="dvprofile"
dxa_demuxer_select="riffdec" dxa_demuxer_select="riffdec"
eac3_demuxer_select="ac3_parser" eac3_demuxer_select="ac3_parser"
f4v_muxer_select="mov_muxer" f4v_muxer_select="mov_muxer"

@ -13,6 +13,9 @@ libavutil: 2013-12-xx
API changes, most recent first: API changes, most recent first:
2014-07-xx - xxxxxxx - lavc 55.56.0 - dv_profile.h
Add a public API for DV profile handling.
2014-06-xx - xxxxxxx - lavu 53.17.0 - imgutils.h 2014-06-xx - xxxxxxx - lavu 53.17.0 - imgutils.h
Add av_image_check_sar(). Add av_image_check_sar().

@ -2,6 +2,7 @@ NAME = avcodec
HEADERS = avcodec.h \ HEADERS = avcodec.h \
avfft.h \ avfft.h \
dv_profile.h \
dxva2.h \ dxva2.h \
vaapi.h \ vaapi.h \
vda.h \ vda.h \
@ -15,6 +16,7 @@ OBJS = allcodecs.o \
bitstream.o \ bitstream.o \
bitstream_filter.o \ bitstream_filter.o \
codec_desc.o \ codec_desc.o \
dv_profile.o \
fmtconvert.o \ fmtconvert.o \
imgconvert.o \ imgconvert.o \
log2_tab.o \ log2_tab.o \
@ -164,8 +166,8 @@ OBJS-$(CONFIG_DVBSUB_DECODER) += dvbsubdec.o
OBJS-$(CONFIG_DVBSUB_ENCODER) += dvbsub.o OBJS-$(CONFIG_DVBSUB_ENCODER) += dvbsub.o
OBJS-$(CONFIG_DVDSUB_DECODER) += dvdsubdec.o OBJS-$(CONFIG_DVDSUB_DECODER) += dvdsubdec.o
OBJS-$(CONFIG_DVDSUB_ENCODER) += dvdsubenc.o OBJS-$(CONFIG_DVDSUB_ENCODER) += dvdsubenc.o
OBJS-$(CONFIG_DVVIDEO_DECODER) += dvdec.o dv.o dvdata.o dv_profile.o OBJS-$(CONFIG_DVVIDEO_DECODER) += dvdec.o dv.o dvdata.o
OBJS-$(CONFIG_DVVIDEO_ENCODER) += dvenc.o dv.o dvdata.o dv_profile.o OBJS-$(CONFIG_DVVIDEO_ENCODER) += dvenc.o dv.o dvdata.o
OBJS-$(CONFIG_DXA_DECODER) += dxa.o OBJS-$(CONFIG_DXA_DECODER) += dxa.o
OBJS-$(CONFIG_DXTORY_DECODER) += dxtory.o OBJS-$(CONFIG_DXTORY_DECODER) += dxtory.o
OBJS-$(CONFIG_EAC3_DECODER) += eac3dec.o eac3_data.o OBJS-$(CONFIG_EAC3_DECODER) += eac3dec.o eac3_data.o
@ -557,8 +559,6 @@ OBJS-$(CONFIG_ADTS_MUXER) += mpeg4audio.o
OBJS-$(CONFIG_ADX_DEMUXER) += adx.o OBJS-$(CONFIG_ADX_DEMUXER) += adx.o
OBJS-$(CONFIG_CAF_DEMUXER) += mpeg4audio.o mpegaudiodata.o \ OBJS-$(CONFIG_CAF_DEMUXER) += mpeg4audio.o mpegaudiodata.o \
ac3tab.o ac3tab.o
OBJS-$(CONFIG_DV_DEMUXER) += dv_profile.o
OBJS-$(CONFIG_DV_MUXER) += dv_profile.o
OBJS-$(CONFIG_FLAC_DEMUXER) += flac.o flacdata.o \ OBJS-$(CONFIG_FLAC_DEMUXER) += flac.o flacdata.o \
vorbis_parser.o xiph.o vorbis_parser.o xiph.o
OBJS-$(CONFIG_FLAC_MUXER) += flac.o flacdata.o OBJS-$(CONFIG_FLAC_MUXER) += flac.o flacdata.o

@ -51,7 +51,7 @@
/* XXX: also include quantization */ /* XXX: also include quantization */
RL_VLC_ELEM ff_dv_rl_vlc[1184]; RL_VLC_ELEM ff_dv_rl_vlc[1184];
static inline void dv_calc_mb_coordinates(const DVprofile *d, int chan, int seq, int slot, static inline void dv_calc_mb_coordinates(const AVDVProfile *d, int chan, int seq, int slot,
uint16_t *tbl) uint16_t *tbl)
{ {
static const uint8_t off[] = { 2, 6, 8, 0, 4 }; static const uint8_t off[] = { 2, 6, 8, 0, 4 };
@ -175,7 +175,7 @@ static const uint8_t dv100_qstep[16] = {
static const uint8_t dv_quant_areas[4] = { 6, 21, 43, 64 }; static const uint8_t dv_quant_areas[4] = { 6, 21, 43, 64 };
int ff_dv_init_dynamic_tables(DVVideoContext *ctx, const DVprofile *d) int ff_dv_init_dynamic_tables(DVVideoContext *ctx, const AVDVProfile *d)
{ {
int j,i,c,s,p; int j,i,c,s,p;
uint32_t *factor1, *factor2; uint32_t *factor1, *factor2;

@ -38,7 +38,7 @@ typedef struct DVwork_chunk {
} DVwork_chunk; } DVwork_chunk;
typedef struct DVVideoContext { typedef struct DVVideoContext {
const DVprofile *sys; const AVDVProfile *sys;
AVFrame *frame; AVFrame *frame;
AVCodecContext *avctx; AVCodecContext *avctx;
uint8_t *buf; uint8_t *buf;
@ -98,10 +98,10 @@ enum dv_pack_type {
extern RL_VLC_ELEM ff_dv_rl_vlc[1184]; extern RL_VLC_ELEM ff_dv_rl_vlc[1184];
int ff_dv_init_dynamic_tables(DVVideoContext *s, const DVprofile *d); int ff_dv_init_dynamic_tables(DVVideoContext *s, const AVDVProfile *d);
int ff_dvvideo_init(AVCodecContext *avctx); int ff_dvvideo_init(AVCodecContext *avctx);
static inline int dv_work_pool_size(const DVprofile *d) static inline int dv_work_pool_size(const AVDVProfile *d)
{ {
int size = d->n_difchan*d->difseg_size*27; int size = d->n_difchan*d->difseg_size*27;
if (DV_PROFILE_IS_1080i50(d)) if (DV_PROFILE_IS_1080i50(d))

@ -18,11 +18,16 @@
#include <stdint.h> #include <stdint.h>
#include "config.h"
#include "libavutil/common.h" #include "libavutil/common.h"
#include "libavutil/log.h" #include "libavutil/log.h"
#include "libavutil/pixdesc.h" #include "libavutil/pixdesc.h"
#include "avcodec.h" #include "avcodec.h"
#include "dv_profile.h" #include "dv_profile.h"
#include "dv_profile_internal.h"
#if CONFIG_DVPROFILE
static const uint8_t dv_audio_shuffle525[10][9] = { static const uint8_t dv_audio_shuffle525[10][9] = {
{ 0, 30, 60, 20, 50, 80, 10, 40, 70 }, /* 1st channel */ { 0, 30, 60, 20, 50, 80, 10, 40, 70 }, /* 1st channel */
@ -63,7 +68,7 @@ static const uint8_t block_sizes_dv100[8] = {
80, 80, 80, 80, 80, 80, 64, 64, 80, 80, 80, 80, 80, 80, 64, 64,
}; };
static const DVprofile dv_profiles[] = { static const AVDVProfile dv_profiles[] = {
{ .dsf = 0, { .dsf = 0,
.video_stype = 0x0, .video_stype = 0x0,
.frame_size = 120000, /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */ .frame_size = 120000, /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */
@ -246,9 +251,23 @@ static const DVprofile dv_profiles[] = {
} }
}; };
const DVprofile* avpriv_dv_frame_profile(const DVprofile *sys, void ff_dv_print_profiles(void *logctx, int loglevel)
const uint8_t* frame, unsigned buf_size)
{ {
int i;
for (i = 0; i < FF_ARRAY_ELEMS(dv_profiles); i++) {
const AVDVProfile *p = &dv_profiles[i];
av_log(logctx, loglevel, "Frame size: %dx%d; pixel format: %s, "
"framerate: %d/%d\n", p->width, p->height, av_get_pix_fmt_name(p->pix_fmt),
p->time_base.den, p->time_base.num);
}
}
#endif /* CONFIG_DVPROFILE */
const AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys,
const uint8_t* frame, unsigned buf_size)
{
#if CONFIG_DVPROFILE
int i, dsf, stype; int i, dsf, stype;
if (buf_size < 80 * 5 + 48 + 4) if (buf_size < 80 * 5 + 48 + 4)
@ -269,30 +288,36 @@ const DVprofile* avpriv_dv_frame_profile(const DVprofile *sys,
/* check if old sys matches and assumes corrupted input */ /* check if old sys matches and assumes corrupted input */
if (sys && buf_size == sys->frame_size) if (sys && buf_size == sys->frame_size)
return sys; return sys;
#endif
return NULL; return NULL;
} }
const DVprofile* avpriv_dv_codec_profile(AVCodecContext* codec) const AVDVProfile *av_dv_codec_profile(int width, int height,
enum AVPixelFormat pix_fmt)
{ {
#if CONFIG_DVPROFILE
int i; int i;
for (i=0; i<FF_ARRAY_ELEMS(dv_profiles); i++) for (i=0; i<FF_ARRAY_ELEMS(dv_profiles); i++)
if (codec->height == dv_profiles[i].height && if (height == dv_profiles[i].height &&
codec->pix_fmt == dv_profiles[i].pix_fmt && pix_fmt == dv_profiles[i].pix_fmt &&
codec->width == dv_profiles[i].width) width == dv_profiles[i].width)
return &dv_profiles[i]; return &dv_profiles[i];
#endif
return NULL; return NULL;
} }
void ff_dv_print_profiles(void *logctx, int loglevel) #if LIBAVCODEC_VERSION_MAJOR < 56
const AVDVProfile *avpriv_dv_frame_profile(const AVDVProfile *sys,
const uint8_t* frame, unsigned buf_size)
{ {
int i; return av_dv_frame_profile(sys, frame, buf_size);
for (i = 0; i < FF_ARRAY_ELEMS(dv_profiles); i++) { }
const DVprofile *p = &dv_profiles[i];
av_log(logctx, loglevel, "Frame size: %dx%d; pixel format: %s, " const AVDVProfile *avpriv_dv_codec_profile(AVCodecContext *codec)
"framerate: %d/%d\n", p->width, p->height, av_get_pix_fmt_name(p->pix_fmt), {
p->time_base.den, p->time_base.num); return av_dv_codec_profile(codec->width, codec->height, codec->pix_fmt);
}
} }
#endif

@ -26,12 +26,12 @@
#include "avcodec.h" #include "avcodec.h"
/* /*
* DVprofile is used to express the differences between various * AVDVProfile is used to express the differences between various
* DV flavors. For now it's primarily used for differentiating * DV flavors. For now it's primarily used for differentiating
* 525/60 and 625/50, but the plans are to use it for various * 525/60 and 625/50, but the plans are to use it for various
* DV specs as well (e.g. SMPTE314M vs. IEC 61834). * DV specs as well (e.g. SMPTE314M vs. IEC 61834).
*/ */
typedef struct DVprofile { typedef struct AVDVProfile {
int dsf; /* value of the dsf in the DV header */ int dsf; /* value of the dsf in the DV header */
int video_stype; /* stype for VAUX source pack */ int video_stype; /* stype for VAUX source pack */
int frame_size; /* total size of one frame in bytes */ int frame_size; /* total size of one frame in bytes */
@ -51,15 +51,28 @@ typedef struct DVprofile {
int audio_samples_dist[5]; /* how many samples are supposed to be */ int audio_samples_dist[5]; /* how many samples are supposed to be */
/* in each frame in a 5 frames window */ /* in each frame in a 5 frames window */
const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */ const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */
} DVprofile; } AVDVProfile;
const DVprofile* avpriv_dv_frame_profile(const DVprofile *sys, #if LIBAVCODEC_VERSION_MAJOR < 56
const uint8_t* frame, unsigned buf_size); const AVDVProfile *avpriv_dv_frame_profile(const AVDVProfile *sys,
const DVprofile* avpriv_dv_codec_profile(AVCodecContext* codec); const uint8_t* frame, unsigned buf_size);
const AVDVProfile *avpriv_dv_codec_profile(AVCodecContext* codec);
#endif
/** /**
* Print all allowed DV profiles into logctx at specified logging level. * Get a DV profile for the provided compressed frame.
*
* @param sys the profile used for the previous frame, may be NULL
* @param frame the compressed data buffer
* @param buf_size size of the buffer in bytes
* @return the DV profile for the supplied data or NULL on failure
*/
const AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys,
const uint8_t *frame, unsigned buf_size);
/**
* Get a DV profile for the provided stream parameters.
*/ */
void ff_dv_print_profiles(void *logctx, int loglevel); const AVDVProfile *av_dv_codec_profile(int width, int height, enum AVPixelFormat pix_fmt);
#endif /* AVCODEC_DV_PROFILE_H */ #endif /* AVCODEC_DV_PROFILE_H */

@ -0,0 +1,27 @@
/*
* This file is part of Libav.
*
* Libav 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.
*
* Libav 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 Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_DV_PROFILE_INTERNAL_H
#define AVCODEC_DV_PROFILE_INTERNAL_H
/**
* Print all allowed DV profiles into logctx at specified logging level.
*/
void ff_dv_print_profiles(void *logctx, int loglevel);
#endif /* AVCODEC_DV_PROFILE_INTERNAL_H */

@ -341,7 +341,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
DVVideoContext *s = avctx->priv_data; DVVideoContext *s = avctx->priv_data;
const uint8_t* vsc_pack; const uint8_t* vsc_pack;
int apt, is16_9, ret; int apt, is16_9, ret;
const DVprofile *sys; const AVDVProfile *sys;
sys = avpriv_dv_frame_profile(s->sys, buf, buf_size); sys = avpriv_dv_frame_profile(s->sys, buf, buf_size);
if (!sys || buf_size < sys->frame_size) { if (!sys || buf_size < sys->frame_size) {

@ -34,6 +34,7 @@
#include "put_bits.h" #include "put_bits.h"
#include "dv.h" #include "dv.h"
#include "dv_tablegen.h" #include "dv_tablegen.h"
#include "dv_profile_internal.h"
static av_cold int dvvideo_encode_init(AVCodecContext *avctx) static av_cold int dvvideo_encode_init(AVCodecContext *avctx)
{ {

@ -29,8 +29,8 @@
#include "libavutil/version.h" #include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 55 #define LIBAVCODEC_VERSION_MAJOR 55
#define LIBAVCODEC_VERSION_MINOR 55 #define LIBAVCODEC_VERSION_MINOR 56
#define LIBAVCODEC_VERSION_MICRO 2 #define LIBAVCODEC_VERSION_MICRO 0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \ LIBAVCODEC_VERSION_MINOR, \

@ -39,7 +39,7 @@
#include "dv.h" #include "dv.h"
struct DVDemuxContext { struct DVDemuxContext {
const DVprofile* sys; /* Current DV profile. E.g.: 525/60, 625/50 */ const AVDVProfile* sys; /* Current DV profile. E.g.: 525/60, 625/50 */
AVFormatContext* fctx; AVFormatContext* fctx;
AVStream* vst; AVStream* vst;
AVStream* ast[4]; AVStream* ast[4];
@ -109,7 +109,7 @@ static const int dv_audio_frequency[3] = {
* are converted into 16bit linear ones. * are converted into 16bit linear ones.
*/ */
static int dv_extract_audio(uint8_t *frame, uint8_t **ppcm, static int dv_extract_audio(uint8_t *frame, uint8_t **ppcm,
const DVprofile *sys) const AVDVProfile *sys)
{ {
int size, chan, i, j, d, of, smpls, freq, quant, half_ch; int size, chan, i, j, d, of, smpls, freq, quant, half_ch;
uint16_t lc, rc; uint16_t lc, rc;
@ -347,7 +347,7 @@ int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
uint8_t *ppcm[5] = { 0 }; uint8_t *ppcm[5] = { 0 };
if (buf_size < DV_PROFILE_BYTES || if (buf_size < DV_PROFILE_BYTES ||
!(c->sys = avpriv_dv_frame_profile(c->sys, buf, buf_size)) || !(c->sys = av_dv_frame_profile(c->sys, buf, buf_size)) ||
buf_size < c->sys->frame_size) { buf_size < c->sys->frame_size) {
return -1; /* Broken frame, or not enough data */ return -1; /* Broken frame, or not enough data */
} }
@ -395,7 +395,8 @@ static int64_t dv_frame_offset(AVFormatContext *s, DVDemuxContext *c,
int64_t timestamp, int flags) int64_t timestamp, int flags)
{ {
// FIXME: sys may be wrong if last dv_read_packet() failed (buffer is junk) // FIXME: sys may be wrong if last dv_read_packet() failed (buffer is junk)
const DVprofile *sys = avpriv_dv_codec_profile(c->vst->codec); const AVDVProfile *sys = av_dv_codec_profile(c->vst->codec->width, c->vst->codec->height,
c->vst->codec->pix_fmt);
int64_t offset; int64_t offset;
int64_t size = avio_size(s->pb) - s->data_offset; int64_t size = avio_size(s->pb) - s->data_offset;
int64_t max_offset = ((size - 1) / sys->frame_size) * sys->frame_size; int64_t max_offset = ((size - 1) / sys->frame_size) * sys->frame_size;
@ -460,9 +461,9 @@ static int dv_read_header(AVFormatContext *s)
avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0) avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0)
return AVERROR(EIO); return AVERROR(EIO);
c->dv_demux->sys = avpriv_dv_frame_profile(c->dv_demux->sys, c->dv_demux->sys = av_dv_frame_profile(c->dv_demux->sys,
c->buf, c->buf,
DV_PROFILE_BYTES); DV_PROFILE_BYTES);
if (!c->dv_demux->sys) { if (!c->dv_demux->sys) {
av_log(s, AV_LOG_ERROR, av_log(s, AV_LOG_ERROR,
"Can't determine profile of DV input stream.\n"); "Can't determine profile of DV input stream.\n");

@ -41,7 +41,7 @@
#define MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio #define MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
struct DVMuxContext { struct DVMuxContext {
const DVprofile* sys; /* current DV profile, e.g.: 525/60, 625/50 */ const AVDVProfile* sys; /* current DV profile, e.g.: 525/60, 625/50 */
int n_ast; /* number of stereo audio streams (up to 2) */ int n_ast; /* number of stereo audio streams (up to 2) */
AVStream *ast[2]; /* stereo audio streams */ AVStream *ast[2]; /* stereo audio streams */
AVFifoBuffer *audio_data[2]; /* FIFO for storing excessive amounts of PCM */ AVFifoBuffer *audio_data[2]; /* FIFO for storing excessive amounts of PCM */
@ -67,7 +67,7 @@ static const int dv_aaux_packs_dist[12][9] = {
{ 0x50, 0x51, 0x52, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff }, { 0x50, 0x51, 0x52, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff },
}; };
static int dv_audio_frame_size(const DVprofile* sys, int frame) static int dv_audio_frame_size(const AVDVProfile* sys, int frame)
{ {
return sys->audio_samples_dist[frame % (sizeof(sys->audio_samples_dist) / return sys->audio_samples_dist[frame % (sizeof(sys->audio_samples_dist) /
sizeof(sys->audio_samples_dist[0]))]; sizeof(sys->audio_samples_dist[0]))];
@ -328,7 +328,7 @@ static DVMuxContext* dv_init_mux(AVFormatContext* s)
c->ast[i]->codec->channels != 2)) c->ast[i]->codec->channels != 2))
goto bail_out; goto bail_out;
} }
c->sys = avpriv_dv_codec_profile(vst->codec); c->sys = av_dv_codec_profile(vst->codec->width, vst->codec->height, vst->codec->pix_fmt);
if (!c->sys) if (!c->sys)
goto bail_out; goto bail_out;

Loading…
Cancel
Save