~ubuntu-dev/mplayer/ubuntu-feisty

« back to all changes in this revision

Viewing changes to libmpcodecs/ve_libdv.c

  • Committer: Reinhard Tartler
  • Date: 2006-07-08 08:45:33 UTC
  • Revision ID: siretart@tauware.de-20060708084533-dbc155bde7122e78
imported mplayer_0.99+1.0pre7try2+cvs20060117

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// requires libdv-0.9.5 !!!
 
2
// (v0.9.0 is too old and has no encoding functionality exported!)
 
3
 
 
4
#include <stdio.h>
 
5
#include <stdlib.h>
 
6
#include <string.h>
 
7
 
 
8
#include "config.h"
 
9
#include "mp_msg.h"
 
10
 
 
11
#ifdef HAVE_LIBDV095
 
12
 
 
13
#include "codec-cfg.h"
 
14
#include "stream.h"
 
15
#include "demuxer.h"
 
16
#include "stheader.h"
 
17
 
 
18
#include "muxer.h"
 
19
 
 
20
#include "img_format.h"
 
21
#include "mp_image.h"
 
22
#include "vf.h"
 
23
 
 
24
#include <libdv/dv.h>
 
25
 
 
26
#ifndef DV_WIDTH
 
27
#define DV_WIDTH       720
 
28
#define DV_PAL_HEIGHT  576
 
29
#define DV_NTSC_HEIGHT 480
 
30
#endif
 
31
 
 
32
struct vf_priv_s {
 
33
    muxer_stream_t* mux;
 
34
    dv_encoder_t* enc;
 
35
    
 
36
};
 
37
#define mux_v (vf->priv->mux)
 
38
 
 
39
//===========================================================================//
 
40
 
 
41
static int config(struct vf_instance_s* vf,
 
42
        int width, int height, int d_width, int d_height,
 
43
        unsigned int flags, unsigned int outfmt){
 
44
 
 
45
    if(width!=DV_WIDTH || (height!=DV_PAL_HEIGHT && height!=DV_NTSC_HEIGHT)){
 
46
        mp_msg(MSGT_VFILTER,MSGL_ERR,"DV: only 720x480 (NTSC) and 720x576 (PAL) resolutions allowed! Try with -vf scale=720:480\n");
 
47
    }
 
48
    
 
49
    vf->priv->enc->isPAL=(height==DV_PAL_HEIGHT);
 
50
    vf->priv->enc->is16x9=(d_width/(float)d_height > 1.7); // 16:9=1.777777
 
51
    vf->priv->enc->vlc_encode_passes=3;
 
52
    vf->priv->enc->static_qno=0;
 
53
    vf->priv->enc->force_dct=0;
 
54
 
 
55
    mux_v->bih->biWidth=width;
 
56
    mux_v->bih->biHeight=height;
 
57
    mux_v->bih->biSizeImage=mux_v->bih->biWidth*mux_v->bih->biHeight*(mux_v->bih->biBitCount/8);
 
58
    mux_v->aspect = (float)d_width/d_height;
 
59
 
 
60
    return 1;
 
61
}
 
62
 
 
63
static int control(struct vf_instance_s* vf, int request, void* data){
 
64
 
 
65
    return CONTROL_UNKNOWN;
 
66
}
 
67
 
 
68
static int query_format(struct vf_instance_s* vf, unsigned int fmt){
 
69
    if(fmt==IMGFMT_YUY2) return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW;
 
70
    if(fmt==IMGFMT_RGB24) return VFCAP_CSP_SUPPORTED;
 
71
    return 0;
 
72
}
 
73
 
 
74
static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){
 
75
 
 
76
    dv_encode_full_frame(vf->priv->enc, mpi->planes, 
 
77
        (mpi->flags&MP_IMGFLAG_YUV) ? e_dv_color_yuv : e_dv_color_rgb,
 
78
        mux_v->buffer);
 
79
 
 
80
    muxer_write_chunk(mux_v, 480 * (vf->priv->enc->isPAL ? 300 : 250) , 0x10);
 
81
    return 1;
 
82
}
 
83
 
 
84
//===========================================================================//
 
85
 
 
86
static int vf_open(vf_instance_t *vf, char* args){
 
87
    vf->config=config;
 
88
    vf->default_caps=VFCAP_CONSTANT;
 
89
    vf->control=control;
 
90
    vf->query_format=query_format;
 
91
    vf->put_image=put_image;
 
92
    vf->priv=malloc(sizeof(struct vf_priv_s));
 
93
    memset(vf->priv,0,sizeof(struct vf_priv_s));
 
94
    vf->priv->mux=(muxer_stream_t*)args;
 
95
    
 
96
    vf->priv->enc=dv_encoder_new(0,1,1); // FIXME, parse some options!
 
97
    if(!vf->priv->enc) return 0;
 
98
    
 
99
    mux_v->bih=calloc(1, sizeof(BITMAPINFOHEADER));
 
100
    mux_v->bih->biSize=sizeof(BITMAPINFOHEADER);
 
101
    mux_v->bih->biWidth=0;
 
102
    mux_v->bih->biHeight=0;
 
103
    mux_v->bih->biCompression=mmioFOURCC('d','v','s','d');
 
104
    mux_v->bih->biPlanes=1;
 
105
    mux_v->bih->biBitCount=24;
 
106
 
 
107
    return 1;
 
108
}
 
109
 
 
110
vf_info_t ve_info_libdv = {
 
111
    "DV encoder using libdv",
 
112
    "libdv",
 
113
    "A'rpi",
 
114
    "for internal use by mencoder",
 
115
    vf_open
 
116
};
 
117
 
 
118
//===========================================================================//
 
119
#endif