summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHarm van der Heijden <hrm@users.sourceforge.net>2001-12-01 19:32:44 +0000
committerHarm van der Heijden <hrm@users.sourceforge.net>2001-12-01 19:32:44 +0000
commit9872ea4c7e58bb6aadeba619a8d6872e7f7b78b8 (patch)
treeaa7452df8853be6fd37b3ea8dee4afb6e4f2de02 /src
parentc6afad1ff946e5a1e07bc5985bee960838b00950 (diff)
downloadxine-lib-9872ea4c7e58bb6aadeba619a8d6872e7f7b78b8.tar.gz
xine-lib-9872ea4c7e58bb6aadeba619a8d6872e7f7b78b8.tar.bz2
added support for mp1e real-time encoder. Needs a separate patch
for mp1e sources though. libfame encoder still the default. CVS patchset: 1150 CVS date: 2001/12/01 19:32:44
Diffstat (limited to 'src')
-rw-r--r--src/dxr3/dxr3_vo_encoder.c67
-rw-r--r--src/dxr3/dxr3_vo_encoder.h27
2 files changed, 82 insertions, 12 deletions
diff --git a/src/dxr3/dxr3_vo_encoder.c b/src/dxr3/dxr3_vo_encoder.c
index 989376284..62ab46e07 100644
--- a/src/dxr3/dxr3_vo_encoder.c
+++ b/src/dxr3/dxr3_vo_encoder.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: dxr3_vo_encoder.c,v 1.7 2001/11/21 20:40:47 hrm Exp $
+ * $Id: dxr3_vo_encoder.c,v 1.8 2001/12/01 19:32:44 hrm Exp $
*
* mpeg1 encoding video out plugin for the dxr3.
*
@@ -367,7 +367,48 @@ static void dxr3_update_frame_format (vo_driver_t *this_gen,
}
}
#endif
+#if USE_MP1E
+ if (! mp1e) {
+ int frame_rate_num, frame_rate_den;
+ char cmd[256], line[128];
+ /* start guessing the framerate */
+ fps = 90000.0/frame->vo_frame.duration;
+ if (fabs(fps - 25) < 0.01) { /* PAL */
+ printf("dxr3enc: setting mpeg output framerate to PAL (25 Hz)\n");
+ frame_rate_num = 25; frame_rate_den = 1;
+ }
+ else if (fabs(fps - 24) < 0.01) { /* FILM */
+ printf("dxr3enc: setting mpeg output framerate to FILM (24 Hz))\n");
+ frame_rate_num = 24; frame_rate_den = 1;
+ }
+ else if (fabs(fps - 23.976) < 0.01) { /* NTSC-FILM */
+ printf("dxr3enc: setting mpeg output framerate to NTSC-FILM (23.976 Hz))\n");
+ frame_rate_num = 24000; frame_rate_den = 1001;
+ }
+ else if (fabs(fps - 29.97) < 0.01) { /* NTSC */
+ printf("dxr3enc: setting mpeg output framerate to NTSC (29.97 Hz)\n");
+ frame_rate_num = 30000; frame_rate_den = 1001;
+ }
+ else { /* try 1/fps, if not legal, libfame will go to PAL */
+ frame_rate_num = (int)(fps + 0.5); frame_rate_den = 1;
+ printf("dxr3enc: trying to set mpeg output framerate to %d Hz\n",
+ frame_rate_num);
+ }
+ sprintf(line, "-s %dx%d -c raw:yuv420-%d-%d-%d-%d", width, oheight,
+ width, oheight, frame_rate_num, frame_rate_den);
+ //sprintf(line, "-c raw:yuv420-%d-%d-%d-%d",
+// width, oheight, frame_rate_num, frame_rate_den);
+ sprintf(cmd, mp1e_command, line);
+ printf("dxr3enc: running command \"%s\"\n", cmd);
+ mp1e = popen(cmd, "w");
+ if (! mp1e) {
+ printf("dxr3enc: could not start '%s'\n", cmd);
+ perror("dxr3enc:");
+ exit(1);
+ }
+ }
+#endif
if(this->aspectratio!=aspect)
dxr3_set_property (this_gen,VO_PROP_ASPECT_RATIO, aspect);
@@ -469,7 +510,19 @@ static void dxr3_frame_copy(vo_frame_t *frame_gen, uint8_t **src)
size = avcodec_encode_video(avc, buffer, DEFAULT_BUFFER_SIZE, &avp);
# endif
#endif
-#if ! USE_MPEG_BUFFER
+#if USE_MP1E
+ size = frame->width*this->oheight;
+ {
+ static x = 0;
+ if (!x)
+ printf("dxr3enc: writing %d x %d = %d bytes\n", frame->width, this->oheight, size);
+ x = 1;
+ }
+ fwrite(y, size, 1, mp1e);
+ fwrite(u, size/4, 1, mp1e);
+ fwrite(v, size/4, 1, mp1e);
+#endif
+#if ! (USE_MPEG_BUFFER || USE_MP1E)
/* write to device now */
if (write(this->fd_video, buffer, size) < 0)
perror("dxr3enc: writing to video device");
@@ -507,7 +560,7 @@ static void dxr3_overlay_blend (vo_driver_t *this_gen, vo_frame_t *frame_gen,
vo_overlay_t *overlay)
{
/* dxr3_driver_t *this = (dxr3_driver_t *) this_gen; */
- fprintf(stderr, "dxr3_vo: dummy function dxr3_overlay_blend called!\n");
+ /*fprintf(stderr, "dxr3_vo: dummy function dxr3_overlay_blend called!\n");*/
}
void dxr3_exit (vo_driver_t *this_gen)
@@ -578,7 +631,7 @@ vo_driver_t *init_video_out_plugin (config_values_t *config, void *visual_gen)
tmpstr, strerror(errno));
return 0;
}
-#if USE_MPEG_BUFFER
+#if USE_MPEG_BUFFER || USE_MP1E
/* we have to close now and open the first time we get
* to display_frame. weird... */
close(this->fd_video);
@@ -615,6 +668,12 @@ vo_driver_t *init_video_out_plugin (config_values_t *config, void *visual_gen)
return 0;
}
#endif
+#if USE_MP1E
+ mp1e = 0;
+ mp1e_command = config->register_string(config, "dxr3enc.mp1e",
+ "mp1e -v -m 1 -g I -b 5 %s > /dev/em8300_mv",
+ "Dxr3enc: mp1e command line (must contain %s)",NULL,NULL,NULL);
+#endif
return &this->vo_driver;
}
diff --git a/src/dxr3/dxr3_vo_encoder.h b/src/dxr3/dxr3_vo_encoder.h
index 021a383fc..d440a9920 100644
--- a/src/dxr3/dxr3_vo_encoder.h
+++ b/src/dxr3/dxr3_vo_encoder.h
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: dxr3_vo_encoder.h,v 1.3 2001/11/12 23:56:31 hrm Exp $
+ * $Id: dxr3_vo_encoder.h,v 1.4 2001/12/01 19:32:44 hrm Exp $
*
*/
@@ -27,17 +27,21 @@
/* 1: enable to buffer the mpeg1 stream;
* 0: write to mpeg device immediately;
- * with 1 sync is better, but playback still not smooth (but see below) */
+ * with 1 sync is better, but playback still not smooth (but see below)
+ * (not supported with mp1e; will disable automatically) */
#define USE_MPEG_BUFFER 1
/* 1: write 6 to MV_COMMAND register. This seems to fix playback problems!
* 0: don't write to register */
#define USE_MAGIC_REGISTER 1
-/* 1: use libfame for encoding
- * 0: use libavcodec from ffmpeg for encoding */
+/* select one mpeg encoder out of the three below */
#define USE_LIBFAME 1
+#define USE_FFMPEG 0
+
+#define USE_MP1E 0
+
/*************************************************************************
* Dxr3 Encoding private stuff below - You shouldn't need to change this *
*************************************************************************/
@@ -46,10 +50,8 @@
* at 640x480 typical sizes are <50 kB. 512 kB should be plenty */
#define DEFAULT_BUFFER_SIZE 512*1024
-#if USE_LIBFAME
- # define USE_FFMPEG 0
-#else
- # define USE_FFMPEG 1
+#if (USE_LIBFAME && USE_FFMPEG) || (USE_LIBFAME && USE_MP1E) || (USE_LIBFFMPEG && USE_MP1E)
+# error "Configure only one mpeg encoder"
#endif
#if USE_LIBFAME
@@ -69,5 +71,14 @@
AVCodec *avcodec;
#endif
+#if USE_MP1E
+ #include <stdio.h>
+ FILE* mp1e;
+ char* mp1e_command;
+# undef USE_MPEG_BUFFER
+# define USE_MPEG_BUFFER 0
+#endif
+
/* mpeg1 buffer, used by both encoders */
unsigned char *buffer;
+