summaryrefslogtreecommitdiff
path: root/src/demuxers/demux_yuv4mpeg2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/demuxers/demux_yuv4mpeg2.c')
-rw-r--r--src/demuxers/demux_yuv4mpeg2.c79
1 files changed, 29 insertions, 50 deletions
diff --git a/src/demuxers/demux_yuv4mpeg2.c b/src/demuxers/demux_yuv4mpeg2.c
index aa1a4dff6..f06201d74 100644
--- a/src/demuxers/demux_yuv4mpeg2.c
+++ b/src/demuxers/demux_yuv4mpeg2.c
@@ -36,10 +36,10 @@
#include <string.h>
#include <stdlib.h>
-#include "xine_internal.h"
-#include "xineutils.h"
-#include "compat.h"
-#include "demux.h"
+#include <xine/xine_internal.h>
+#include <xine/xineutils.h>
+#include <xine/compat.h>
+#include <xine/demux.h>
#include "bswap.h"
#define Y4M_SIGNATURE_SIZE 9
@@ -69,6 +69,7 @@ typedef struct {
int aspect_d;
int progressive;
int top_field_first;
+ int color_matrix;
unsigned int frame_pts_inc;
unsigned int frame_size;
@@ -89,6 +90,8 @@ static int open_yuv4mpeg2_file(demux_yuv4mpeg2_t *this) {
this->aspect_n = this->aspect_d = this->progressive =
this->top_field_first = this->data_start = 0;
+ this->color_matrix = 4; /* undefined, mpeg range */
+
if (_x_demux_read_header(this->input, header, Y4M_HEADER_BYTES) != Y4M_HEADER_BYTES)
return 0;
@@ -179,6 +182,17 @@ static int open_yuv4mpeg2_file(demux_yuv4mpeg2_t *this) {
header_ptr = header_endptr;
break;
+ case 'X':
+ /* private extra info */
+ if (!strncasecmp (header_ptr + 1, "XINE_CM=", 8)) {
+ int i = strtol(header_ptr + 9, &header_endptr, 10);
+ if (header_endptr > header_ptr + 9) {
+ this->color_matrix = i;
+ header_ptr = header_endptr;
+ break;
+ }
+ }
+ /* fall through */
default:
/* skip whatever this is */
while ((*header_ptr != ' ') && (header_ptr < header_end))
@@ -257,6 +271,9 @@ static int demux_yuv4mpeg2_send_chunk(demux_plugin_t *this_gen) {
buf->extra_info->input_time = pts / 90;
buf->pts = pts;
+ buf->decoder_flags |= BUF_FLAG_COLOR_MATRIX;
+ buf->decoder_info[4] = this->color_matrix;
+
buf->size = MIN(bytes_remaining, buf->max_size);
bytes_remaining -= buf->size;
@@ -355,12 +372,6 @@ static int demux_yuv4mpeg2_seek (demux_plugin_t *this_gen,
return this->status;
}
-static void demux_yuv4mpeg2_dispose (demux_plugin_t *this_gen) {
- demux_yuv4mpeg2_t *this = (demux_yuv4mpeg2_t *) this_gen;
-
- free(this);
-}
-
static int demux_yuv4mpeg2_get_status (demux_plugin_t *this_gen) {
demux_yuv4mpeg2_t *this = (demux_yuv4mpeg2_t *) this_gen;
@@ -392,7 +403,7 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen, xine_stream_t *str
this->demux_plugin.send_headers = demux_yuv4mpeg2_send_headers;
this->demux_plugin.send_chunk = demux_yuv4mpeg2_send_chunk;
this->demux_plugin.seek = demux_yuv4mpeg2_seek;
- this->demux_plugin.dispose = demux_yuv4mpeg2_dispose;
+ this->demux_plugin.dispose = default_demux_plugin_dispose;
this->demux_plugin.get_status = demux_yuv4mpeg2_get_status;
this->demux_plugin.get_stream_length = demux_yuv4mpeg2_get_stream_length;
this->demux_plugin.get_capabilities = demux_yuv4mpeg2_get_capabilities;
@@ -403,17 +414,7 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen, xine_stream_t *str
switch (stream->content_detection_method) {
- case METHOD_BY_EXTENSION: {
- const char *const mrl = input->get_mrl (input);
- const char *const extensions = class_gen->get_extensions (class_gen);
-
- if (!_x_demux_check_extension (mrl, extensions)) {
- free (this);
- return NULL;
- }
- }
- /* falling through is intended */
-
+ case METHOD_BY_MRL:
case METHOD_BY_CONTENT:
case METHOD_EXPLICIT:
@@ -432,39 +433,17 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen, xine_stream_t *str
return &this->demux_plugin;
}
-static const char *get_description (demux_class_t *this_gen) {
- return "YUV4MPEG2 file demux plugin";
-}
-
-static const char *get_identifier (demux_class_t *this_gen) {
- return "YUV4MPEG2";
-}
-
-static const char *get_extensions (demux_class_t *this_gen) {
- return "y4m";
-}
-
-static const char *get_mimetypes (demux_class_t *this_gen) {
- return NULL;
-}
-
-static void class_dispose (demux_class_t *this_gen) {
- demux_yuv4mpeg2_class_t *this = (demux_yuv4mpeg2_class_t *) this_gen;
-
- free (this);
-}
-
static void *init_plugin (xine_t *xine, void *data) {
demux_yuv4mpeg2_class_t *this;
this = calloc(1, sizeof(demux_yuv4mpeg2_class_t));
this->demux_class.open_plugin = open_plugin;
- this->demux_class.get_description = get_description;
- this->demux_class.get_identifier = get_identifier;
- this->demux_class.get_mimetypes = get_mimetypes;
- this->demux_class.get_extensions = get_extensions;
- this->demux_class.dispose = class_dispose;
+ this->demux_class.description = N_("YUV4MPEG2 file demux plugin");
+ this->demux_class.identifier = "YUV4MPEG2";
+ this->demux_class.mimetypes = NULL;
+ this->demux_class.extensions = "y4m";
+ this->demux_class.dispose = default_demux_class_dispose;
return this;
}
@@ -478,6 +457,6 @@ static const demuxer_info_t demux_info_yuv4mpeg2 = {
const plugin_info_t xine_plugin_info[] EXPORTED = {
/* type, API, "name", version, special_info, init_function */
- { PLUGIN_DEMUX, 26, "yuv4mpeg2", XINE_VERSION_CODE, &demux_info_yuv4mpeg2, init_plugin },
+ { PLUGIN_DEMUX, 27, "yuv4mpeg2", XINE_VERSION_CODE, &demux_info_yuv4mpeg2, init_plugin },
{ PLUGIN_NONE, 0, "", 0, NULL, NULL }
};