This is sort-of upstream, sort-of not.

As you know, upstream includes config.h in dv_types.h, which would
expose YUV_420_USE_YV12 to clients, except that config.h isn't (or
shouldn't) be installed.  So it should probably be defined in dv_types.h
as well, which we can do by replacing dv_types.h with a dv_types.h.in.

This patch should be suitable for sending upstream.  Of course it
requires an autoreconf afterwards.

--- libdv-1.0.0.orig/configure.ac
+++ libdv-1.0.0/configure.ac
@@ -2,6 +2,7 @@
 AC_INIT(libdv/parse.c)
 dnl AC_CONFIG_AUX_DIR(config)
 AM_CONFIG_HEADER(config.h)
+AM_CONFIG_HEADER(libdv/dv_types.h)
 
 RPM_RELEASE=1
 AC_CANONICAL_HOST
@@ -111,13 +112,14 @@
        esac
 fi
 
+AC_DEFINE(YUV_420_USE_YV12,0)
 AC_ARG_WITH(pal-yuv,
 [  --with-pal-yuv=(YV12|YUY2)  Select YUV format for IEC PAL (YUY2 by default) 
],
 [
        case "$with_pal_yuv" in
             YV12)
                AC_MSG_RESULT(YV12)
-               AC_DEFINE(YUV_420_USE_YV12)
+               AC_DEFINE(YUV_420_USE_YV12,1)
                ;;
             *)
                AC_MSG_RESULT(YUY2)
--- libdv-1.0.0.orig/libdv/dv_types.h.in
+++ libdv-1.0.0/libdv/dv_types.h.in
@@ -0,0 +1,533 @@
+/*
+ *  dv_types.h
+ *
+ *     Copyright (C) Charles 'Buck' Krasic - April 2000
+ *     Copyright (C) Erik Walthinsen - April 2000
+ *
+ *  This file is part of libdv, a free DV (IEC 61834/SMPTE 314M)
+ *  codec.
+ *
+ *  libdv is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU Lesser Public License as published by
+ *  the Free Software Foundation; either version 2.1, or (at your
+ *  option) any later version.
+ *   
+ *  libdv 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 Public License for more details.
+ *   
+ *  You should have received a copy of the GNU Lesser Public License
+ *  along with libdv; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
+ *
+ *  The libdv homepage is http://libdv.sourceforge.net/.  
+ */
+#ifndef DV_TYPES_H
+#define DV_TYPES_H
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if HAVE_LIBPOPT
+#include <popt.h>
+#endif // HAVE_LIBPOPT
+
+#include <stdlib.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <time.h>
+#if HAVE_ENDIAN_H
+#include <endian.h>
+#elif HAVE_MACHINE_ENDIAN_H
+#include <machine/endian.h>
+#endif
+
+/* please tell me these are defined somewhere standard??? */
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef MIN
+#define MIN(a,b) ((a)<(b)?(a):(b))
+#endif
+#ifndef MAX
+#define MAX(a,b) ((a)<(b)?(b):(a))
+#endif
+#ifndef CLAMP
+#define CLAMP(a,x,b) (MIN(b,MAX(a,x)))
+#endif
+
+// For now assume ARCH_X86 means GCC with hints.
+#ifdef ARCH_X86
+#define HAVE_GCC 1
+#endif
+#ifdef ARCH_X86_64
+#define HAVE_GCC 1
+#endif
+//#define HAVE_GCC 0
+
+#if HAVE_GCC
+#define ALIGN64 __attribute__ ((aligned (64)))
+#define ALIGN32 __attribute__ ((aligned (32)))
+#define ALIGN8 __attribute__ ((aligned (8)))
+#else
+#define ALIGN64
+#define ALIGN32
+#define ALIGN8
+#define __inline__ inline
+#define __FUNCTION__ __FILE__ // Less specific info, but it's a string.
+#endif
+
+#define DV_AUDIO_MAX_SAMPLES 1944
+
+#define DV_AUDIO_OPT_FREQUENCY    0
+#define DV_AUDIO_OPT_QUANTIZATION 1
+#define DV_AUDIO_OPT_EMPHASIS     2
+#define DV_AUDIO_OPT_CHAN_MIX     3
+#define DV_AUDIO_OPT_CALLBACK     4
+#define DV_AUDIO_NUM_OPTS         5
+
+#define DV_AUDIO_CORRECT_NONE     0
+#define DV_AUDIO_CORRECT_SILENCE  1
+#define DV_AUDIO_CORRECT_AVERAGE  2
+
+#define DV_VIDEO_OPT_BLOCK_QUALITY 0
+#define DV_VIDEO_OPT_MONOCHROME    1
+#define DV_VIDEO_OPT_CALLBACK      2
+#define DV_VIDEO_NUM_OPTS          3
+
+#define DV_DECODER_OPT_SYSTEM        0
+#define DV_DECODER_OPT_VIDEO_INCLUDE 1
+#define DV_DECODER_OPT_AUDIO_INCLUDE 2
+#define DV_DECODER_OPT_CALLBACK      3
+#define DV_DECODER_OPT_NTSCSETUP     4
+#define DV_DECODER_NUM_OPTS          5
+
+#define DV_OSS_OPT_DEVICE 0
+#define DV_OSS_OPT_FILE   1
+#define DV_OSS_NUM_OPTS   2
+
+#define DV_DCT_AUTO    (-1)
+#define DV_DCT_248     (1)
+#define DV_DCT_88      (0)
+
+#define DV_SCT_HEADER    (0x0)
+#define DV_SCT_SUBCODE   (0x1)
+#define DV_SCT_VAUX      (0x2)
+#define DV_SCT_AUDIO     (0x3)
+#define DV_SCT_VIDEO     (0x4)
+
+#define DV_FSC_0         (0)
+#define DV_FSC_1         (1)
+
+#if ARCH_X86 || ARCH_X86_64
+#define DV_WEIGHT_BIAS  6
+#else
+#define DV_WEIGHT_BIAS  0
+#endif
+
+#define DV_QUALITY_COLOR       1     /* Clear this bit to make monochrome */
+
+#define DV_QUALITY_AC_MASK     (0x3 << 1)
+#define DV_QUALITY_DC          (0x0 << 1)
+#define DV_QUALITY_AC_1        (0x1 << 1)
+#define DV_QUALITY_AC_2        (0x2 << 1)
+
+#define DV_QUALITY_BEST       (DV_QUALITY_COLOR | DV_QUALITY_AC_2)
+#define DV_QUALITY_FASTEST     0     /* Monochrome, DC coeffs only */
+
+typedef enum color_space_e { 
+  e_dv_color_yuv, 
+  e_dv_color_rgb, 
+  e_dv_color_bgr0, 
+} dv_color_space_t;
+
+#ifndef YUV_420_USE_YV12
+#define YUV_420_USE_YV12       @YUV_420_USE_YV12@
+#endif
+
+/* Pixel formats used when color space is e_dv_color_yuv */
+#define DV_PIXEL_FORMAT_YUY2   0x32595559
+#define DV_PIXEL_FORMAT_YV12   0x32315659
+#define DV_PIXEL_FORMAT_411    DV_PIXEL_FORMAT_YUY2
+#if YUV_420_USE_YV12
+#define DV_PIXEL_FORMAT_420    DV_PIXEL_FORMAT_YV12
+#else
+#define DV_PIXEL_FORMAT_420    DV_PIXEL_FORMAT_YUY2
+#endif
+
+typedef enum sample_e { 
+  e_dv_sample_none = 0,
+  e_dv_sample_411,
+  e_dv_sample_420,
+  e_dv_sample_422,
+} dv_sample_t;
+
+typedef enum system_e { 
+  e_dv_system_none = 0,
+  e_dv_system_525_60,    // NTSC
+  e_dv_system_625_50,    // PAL
+} dv_system_t;
+
+typedef enum std_e { 
+  e_dv_std_none = 0,
+  e_dv_std_smpte_314m,    
+  e_dv_std_iec_61834,    
+} dv_std_t;
+
+typedef int16_t dv_coeff_t;
+typedef int32_t dv_248_coeff_t;
+
+typedef struct bitstream_s {
+  uint32_t current_word;
+  uint32_t next_word;
+  uint16_t bits_left;
+  uint16_t next_bits;
+
+  uint8_t *buf;
+  uint32_t buflen;
+  int32_t  bufoffset;
+
+  uint32_t (*bitstream_next_buffer) (uint8_t **,void *);
+  void *priv;
+
+  int32_t bitsread;
+} bitstream_t;
+
+typedef struct {
+  int8_t sct;      // Section type (header,subcode,aux,audio,video)
+  int8_t dsn;      // DIF sequence number (0-12)
+  int fsc;   // First (0)/Second channel (1)
+  int8_t dbn;      // DIF block number (0-134)
+} dv_id_t;
+
+typedef struct {
+  int dsf;   // DIF sequence flag: 525/60 (0) or 625,50 (1)
+  int8_t apt;
+  int tf1;
+  int8_t ap1;
+  int tf2;
+  int8_t ap2;
+  int tf3;
+  int8_t ap3;
+} dv_header_t;
+
+typedef struct {
+  dv_coeff_t   coeffs[64] ALIGN8;
+  int         dct_mode;
+  int         class_no;
+  int8_t        *reorder;
+  int8_t        *reorder_sentinel;
+  int         offset;   // bitstream offset of first unused bit
+  int         end;      // bitstream offset of last bit + 1
+  int         eob;
+  int     mark;     // used during passes 2 & 3 for tracking fragmented vlcs
+} dv_block_t;
+
+typedef struct {
+  int       i,j;   // superblock row/column,
+  int       k;     // macroblock no. within superblock */
+  int       x, y;  // top-left corner position
+  dv_block_t b[6];
+  int       qno;
+  int       sta;
+  int       vlc_error;
+  int       eob_count;
+} dv_macroblock_t;
+
+typedef struct {
+  int            i, k;
+  bitstream_t    *bs;
+  dv_macroblock_t mb[5];
+  int        isPAL;
+} dv_videosegment_t;
+
+typedef struct {
+  dv_videosegment_t seg[27];
+} dv_dif_sequence_t;
+
+// Frame
+typedef struct {
+  int           placement_done;
+  dv_dif_sequence_t  ds[12];
+} dv_frame_t;
+
+/* From Section 8.1 of 61834-4: Audio auxiliary data source pack fields 
pc1-pc4.
+ * Need this data to figure out what format audio is in the stream. */
+
+/* About bitfield ordering: The C standard does not specify the order
+   of bits within a unit of storage.  In the code here, I will use the
+   definition of BYTE_ORDER to determine whether to set
+   BIG_ENDIAN_BITFIELD or LITTLE_ENDIAN_BITFIELD.  There is nothing
+   that guarantees this relationship to be correct, but I know of no
+   counter examples.  If we do find out there is one, we'll have to
+   fix it... */
+
+#if (BYTE_ORDER == LITTLE_ENDIAN)
+#define LITTLE_ENDIAN_BITFIELD
+#else
+#define BIG_ENDIAN_BITFIELD
+#endif  /* (BYTE_ORDER == LITTLE_ENDIAN) */
+
+typedef struct {
+#if defined(LITTLE_ENDIAN_BITFIELD)
+  uint8_t af_size : 6; /* Samples per frame:
+                      * 32 kHz: 1053-1080
+                      * 44.1: 1452-1489
+                      * 48: 1580-1620 */
+  uint8_t         : 1; // Should be 1
+  uint8_t lf      : 1; // Locked mode flag (1 = unlocked)
+#elif defined(BIG_ENDIAN_BITFIELD)
+  uint8_t lf      : 1; // Locked mode flag (1 = unlocked)
+  uint8_t         : 1; // Should be 1
+  uint8_t af_size : 6; /* Samples per frame:
+                      * 32 kHz: 1053-1080
+                      * 44.1: 1452-1489
+                      * 48: 1580-1620 */
+#endif // BIG_ENDIAN_BITFIELD
+} dv_aaux_as_pc1_t;
+
+typedef struct {
+#if defined(LITTLE_ENDIAN_BITFIELD)
+  uint8_t audio_mode: 4; // See 8.1...
+  uint8_t pa        : 1; // pair bit: 0 = one pair of channels, 1 = 
independent channel (for sm = 1, pa shall be 1)
+  uint8_t chn       : 2; // number of audio channels per block: 0 = 1 channel, 
1 = 2 channels, others reserved
+  uint8_t sm        : 1; // stereo mode: 0 = Multi-stereo, 1 = Lumped
+#elif defined(BIG_ENDIAN_BITFIELD)
+  uint8_t sm        : 1; // stereo mode: 0 = Multi-stereo, 1 = Lumped
+  uint8_t chn       : 2; // number of audio channels per block: 0 = 1 channel, 
1 = 2 channels, others reserved
+  uint8_t pa        : 1; // pair bit: 0 = one pair of channels, 1 = 
independent channel (for sm = 1, pa shall be 1)
+  uint8_t audio_mode: 4; // See 8.1...
+#endif // BIG_ENDIAN_BITFIELD
+} dv_aaux_as_pc2_t;
+
+typedef struct {
+#if defined(LITTLE_ENDIAN_BITFIELD)
+  uint8_t stype     :5; // 0x0 = SD (525/625), 0x2 = HD (1125,1250), others 
reserved
+  uint8_t system    :1; // 0 = 60 fields, 1 = 50 field
+  uint8_t ml        :1; // Multi-languag flag
+  uint8_t           :1;
+#elif defined(BIG_ENDIAN_BITFIELD)
+  uint8_t           :1;
+  uint8_t ml        :1; // Multi-languag flag
+  uint8_t system    :1; // 0 = 60 fields, 1 = 50 field
+  uint8_t stype     :5; // 0x0 = SD (525/625), 0x2 = HD (1125,1250), others 
reserved
+#endif // BIG_ENDIAN_BITFIELD
+} dv_aaux_as_pc3_t;
+
+typedef struct {
+#if defined(LITTLE_ENDIAN_BITFIELD)
+  uint8_t qu        :3; // quantization: 0=16bits linear, 1=12bits non-linear, 
2=20bits linear, others reserved
+  uint8_t smp       :3; // sampling frequency: 0=48kHz, 1=44,1 kHz, 2=32 kHz
+  uint8_t tc        :1; // time constant of emphasis: 1=50/15us, 0=reserved
+  uint8_t ef        :1; // emphasis: 0=on, 1=off
+#elif defined(BIG_ENDIAN_BITFIELD)
+  uint8_t ef        :1; // emphasis: 0=on, 1=off
+  uint8_t tc        :1; // time constant of emphasis: 1=50/15us, 0=reserved
+  uint8_t smp       :3; // sampling frequency: 0=48kHz, 1=44,1 kHz, 2=32 kHz
+  uint8_t qu        :3; // quantization: 0=16bits linear, 1=12bits non-linear, 
2=20bits linear, others reserved
+#endif // BIG_ENDIAN_BITFIELD
+} dv_aaux_as_pc4_t;
+
+// AAUX source pack (AS)
+typedef struct {
+  uint8_t pc0; // value is 0x50;
+  dv_aaux_as_pc1_t pc1;
+  dv_aaux_as_pc2_t pc2;
+  dv_aaux_as_pc3_t pc3;
+  dv_aaux_as_pc4_t pc4;
+} dv_aaux_as_t;
+
+// From 61834-4 (section 8.2), and SMPE 314M (section 4.6.2.3.2)
+typedef struct {
+#if defined(LITTLE_ENDIAN_BITFIELD)
+  uint8_t ss        :2; /* 61834 says "Source and recorded situation...", 
SMPTE says EFC (emphasis audio channel flag)
+                         0=emphasis off, 1=emphasis on, others reserved.  EFC 
shall be set for each audio block. */
+  uint8_t cmp       :2; /* number of times compression: 0=once, 1=twice, 
2=three or more, 3=no information */
+  uint8_t isr       :2; /* 0=analog input, 1=digital input, 2=reserved, 3=no 
information */
+  uint8_t cgms      :2; /* Copy generation management system:
+                         0=unrestricted, 1=not used, 2=one generation only, 
3=no copy */
+#elif defined(BIG_ENDIAN_BITFIELD)
+  uint8_t cgms      :2; /* Copy generation management system:
+                         0=unrestricted, 1=not used, 2=one generation only, 
3=no copy */
+  uint8_t isr       :2; /* 0=analog input, 1=digital input, 2=reserved, 3=no 
information */
+  uint8_t cmp       :2; /* number of times compression: 0=once, 1=twice, 
2=three or more, 3=no information */
+  uint8_t ss        :2; /* 61834 says "Source and recorded situation...", 
SMPTE says EFC (emphasis audio channel flag)
+                         0=emphasis off, 1=emphasis on, others reserved.  EFC 
shall be set for each audio block. */
+#endif // BIG_ENDIAN_BITFIELD
+} dv_aaux_asc_pc1_t;
+
+typedef struct {
+#if defined(LITTLE_ENDIAN_BITFIELD)
+  uint8_t insert_ch :3; /* see 61834-4... */
+  uint8_t rec_mode  :3; /* recording mode: 1=original, others=various dubs... 
(see 68134-4) */
+  uint8_t rec_end   :1; /* recording end point: same as starting... */
+  uint8_t rec_st    :1; /* recording start point: 0=yes,1=no */
+#elif defined(BIG_ENDIAN_BITFIELD)
+  uint8_t rec_st    :1; /* recording start point: 0=yes,1=no */
+  uint8_t rec_end   :1; /* recording end point: same as starting... */
+  uint8_t rec_mode  :3; /* recording mode: 1=original, others=various dubs... 
(see 68134-4) */
+  uint8_t insert_ch :3; /* see 61834-4... */
+#endif // BIG_ENDIAN_BITFIELD
+} dv_aaux_asc_pc2_t;
+
+typedef struct {
+#if defined(LITTLE_ENDIAN_BITFIELD)
+  uint8_t speed     :7; /* speed: see tables in 314M and 61834-4 (they 
differ), except 0xff = invalid/unkown */
+  uint8_t drf       :1; /* direction: 1=forward, 0=reverse */
+#elif defined(BIG_ENDIAN_BITFIELD)
+  uint8_t drf       :1; /* direction: 1=forward, 0=reverse */
+  uint8_t speed     :7; /* speed: see tables in 314M and 61834-4 (they 
differ), except 0xff = invalid/unkown */
+#endif // BIG_ENDIAN_BITFIELD
+} dv_aaux_asc_pc3_t;
+
+typedef struct {
+#if defined(LITTLE_ENDIAN_BITFIELD)
+  uint8_t genre_category: 7;
+  uint8_t               : 1;
+#elif defined(BIG_ENDIAN_BITFIELD)
+  uint8_t               : 1;
+  uint8_t genre_category: 7;
+#endif // BIG_ENDIAN_BITFIELD
+} dv_aaux_asc_pc4_t;
+
+// AAUX source control pack (ASC)
+typedef struct {
+  uint8_t pc0; // value is 0x51;
+  dv_aaux_asc_pc1_t pc1;
+  dv_aaux_asc_pc2_t pc2;
+  dv_aaux_asc_pc3_t pc3;
+  dv_aaux_asc_pc4_t pc4;
+} dv_aaux_asc_t;
+
+typedef struct dv_decoder_s  *dv_decoder_tp;
+
+typedef struct {
+  dv_aaux_as_t      aaux_as, /* low-level audio format info direct from the 
stream */
+                    aaux_as1;
+  dv_aaux_asc_t     aaux_asc,
+                    aaux_asc1;
+  int              samples_this_frame;
+  int              raw_samples_this_frame [2];
+  int              quantization;
+  int              max_samples;
+  int              frequency;
+  int              num_channels;
+  int              raw_num_channels;
+  int              emphasis;
+  int              arg_audio_emphasis;
+  int              arg_audio_frequency;
+  int              arg_audio_quantization;
+
+  int              new_recording_on_next_frame;
+  int              new_recording_current_time_stamp [4],
+                   arg_mixing_level;
+
+  /* -------------------------------------------------------------------------
+   * audio error correction handling
+   */
+  int              correction_method,
+                   block_failure,
+                   sample_failure,
+                   real_samples_this_frame,
+                   fail_samples_this_frame;
+  /* -------------------------------------------------------------------------
+   * memorize deemphasis values
+   */
+  short            lastin [4];
+  double           lastout [4];
+
+  FILE             *error_log;
+  dv_decoder_tp    dv_decoder;
+#if HAVE_LIBPOPT
+  struct poptOption option_table[DV_AUDIO_NUM_OPTS+1];
+#endif // HAVE_LIBPOPT
+} dv_audio_t;
+
+typedef struct {
+  unsigned int              quality;
+  int               arg_block_quality; // default 3
+  int               arg_monochrome;
+  /* -------------------------------------------------------------------------
+   * video error log file
+   */
+  FILE              *error_log;
+  dv_decoder_tp     dv_decoder;
+#if HAVE_LIBPOPT
+  struct poptOption  option_table[DV_VIDEO_NUM_OPTS+1];
+#endif // HAVE_LIBPOPT
+
+} dv_video_t;
+
+typedef struct dv_decoder_s {
+  unsigned int       quality;
+  dv_system_t        system;
+  dv_std_t           std;
+  dv_sample_t        sampling;
+  int                num_dif_seqs; // DIF sequences per frame
+  int                height, width;
+  size_t             frame_size;
+  dv_header_t        header;
+  dv_audio_t        *audio;
+  dv_video_t        *video;
+  int                arg_video_system;
+  int                add_ntsc_setup;
+  int                clamp_luma;
+  int                clamp_chroma;
+  int                prev_frame_decoded;
+  /* -------------------------------------------------------------------------
+   * per dif sequence! there are 45 vaux data packs
+   * 1 byte header 4 byte data.
+   */
+  uint8_t             vaux_next;
+  uint8_t             vaux_pack [256];
+  uint8_t             vaux_data [45][4];
+
+  uint8_t             ssyb_next;
+  uint8_t             ssyb_pack [256];
+  uint8_t             ssyb_data [45][4];
+  bitstream_t        *bs;
+
+#if HAVE_LIBPOPT
+  struct poptOption option_table[DV_DECODER_NUM_OPTS+1];
+#endif // HAVE_LIBPOPT
+} dv_decoder_t;
+
+typedef struct {
+  int                 fd;
+  int16_t             *buffer;
+  uint8_t             *arg_audio_file;
+  char                *arg_audio_device;
+#if HAVE_LIBPOPT
+  struct poptOption option_table[DV_OSS_NUM_OPTS+1];
+#endif // HAVE_LIBPOPT
+} dv_oss_t;
+
+typedef struct {
+  int    isPAL;
+  int    is16x9;
+  int    vlc_encode_passes;
+  int    static_qno;
+  int    force_dct; 
+  int    rem_ntsc_setup;
+  int    clamp_luma;
+  int    clamp_chroma;
+  int    frame_count;
+  int    samples_this_frame;
+  /* the below are private */
+  short *img_y;
+  short *img_cr;
+  short *img_cb;
+} dv_encoder_t;
+
+#if ARCH_X86
+extern int dv_use_mmx;
+#elif ARCH_X86_64
+extern int dv_use_mmx;
+#endif
+
+#endif // DV_TYPES_H
--- END ---

-- 
Ben Hutchings
I'm not a reverse psychological virus.  Please don't copy me into your
sig.

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to