Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

V4L/DVB (5307): Add support for the cx23415 MPEG decoding features.

The cx23415 adds some extra features that this DVB decoding API did
not support. This API has been expanded to support the required
features. Both source and binary backwards compatibility is kept
intact by these changes. So existing applications are not affected.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Ralph Metzler <rjkm@metzlerbros.de>
Signed-off-by: Oliver Endriss <o.endriss@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>

authored by

Hans Verkuil and committed by
Mauro Carvalho Chehab
2435be11 3434eb7e

+71 -19
+12 -12
drivers/media/dvb/ttpci/av7110_av.c
··· 1009 1009 if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) 1010 1010 ret = av7110_av_stop(av7110, RP_VIDEO); 1011 1011 else 1012 - ret = vidcom(av7110, VIDEO_CMD_STOP, 1012 + ret = vidcom(av7110, AV_VIDEO_CMD_STOP, 1013 1013 av7110->videostate.video_blank ? 0 : 1); 1014 1014 if (!ret) 1015 1015 av7110->trickmode = TRICK_NONE; ··· 1019 1019 av7110->trickmode = TRICK_NONE; 1020 1020 if (av7110->videostate.play_state == VIDEO_FREEZED) { 1021 1021 av7110->videostate.play_state = VIDEO_PLAYING; 1022 - ret = vidcom(av7110, VIDEO_CMD_PLAY, 0); 1022 + ret = vidcom(av7110, AV_VIDEO_CMD_PLAY, 0); 1023 1023 if (ret) 1024 1024 break; 1025 1025 } ··· 1034 1034 ret = av7110_av_start_play(av7110, RP_VIDEO); 1035 1035 } 1036 1036 if (!ret) 1037 - ret = vidcom(av7110, VIDEO_CMD_PLAY, 0); 1037 + ret = vidcom(av7110, AV_VIDEO_CMD_PLAY, 0); 1038 1038 if (!ret) 1039 1039 av7110->videostate.play_state = VIDEO_PLAYING; 1040 1040 break; ··· 1044 1044 if (av7110->playing & RP_VIDEO) 1045 1045 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Pause, 0); 1046 1046 else 1047 - ret = vidcom(av7110, VIDEO_CMD_FREEZE, 1); 1047 + ret = vidcom(av7110, AV_VIDEO_CMD_FREEZE, 1); 1048 1048 if (!ret) 1049 1049 av7110->trickmode = TRICK_FREEZE; 1050 1050 break; ··· 1053 1053 if (av7110->playing & RP_VIDEO) 1054 1054 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Continue, 0); 1055 1055 if (!ret) 1056 - ret = vidcom(av7110, VIDEO_CMD_PLAY, 0); 1056 + ret = vidcom(av7110, AV_VIDEO_CMD_PLAY, 0); 1057 1057 if (!ret) { 1058 1058 av7110->videostate.play_state = VIDEO_PLAYING; 1059 1059 av7110->trickmode = TRICK_NONE; ··· 1136 1136 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, 1137 1137 __Scan_I, 2, AV_PES, 0); 1138 1138 else 1139 - ret = vidcom(av7110, VIDEO_CMD_FFWD, arg); 1139 + ret = vidcom(av7110, AV_VIDEO_CMD_FFWD, arg); 1140 1140 if (!ret) { 1141 1141 av7110->trickmode = TRICK_FAST; 1142 1142 av7110->videostate.play_state = VIDEO_PLAYING; ··· 1147 1147 if (av7110->playing&RP_VIDEO) { 1148 1148 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0); 1149 1149 if (!ret) 1150 - ret = vidcom(av7110, VIDEO_CMD_SLOW, arg); 1150 + ret = vidcom(av7110, AV_VIDEO_CMD_SLOW, arg); 1151 1151 } else { 1152 - ret = vidcom(av7110, VIDEO_CMD_PLAY, 0); 1152 + ret = vidcom(av7110, AV_VIDEO_CMD_PLAY, 0); 1153 1153 if (!ret) 1154 - ret = vidcom(av7110, VIDEO_CMD_STOP, 0); 1154 + ret = vidcom(av7110, AV_VIDEO_CMD_STOP, 0); 1155 1155 if (!ret) 1156 - ret = vidcom(av7110, VIDEO_CMD_SLOW, arg); 1156 + ret = vidcom(av7110, AV_VIDEO_CMD_SLOW, arg); 1157 1157 } 1158 1158 if (!ret) { 1159 1159 av7110->trickmode = TRICK_SLOW; ··· 1182 1182 ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, 1183 1183 __Slow, 2, 0, 0); 1184 1184 if (!ret) 1185 - ret = vidcom(av7110, VIDEO_CMD_SLOW, arg); 1185 + ret = vidcom(av7110, AV_VIDEO_CMD_SLOW, arg); 1186 1186 } 1187 1187 if (av7110->trickmode == TRICK_FREEZE) 1188 - ret = vidcom(av7110, VIDEO_CMD_STOP, 1); 1188 + ret = vidcom(av7110, AV_VIDEO_CMD_STOP, 1); 1189 1189 } 1190 1190 break; 1191 1191
+5 -5
drivers/media/dvb/ttpci/av7110_hw.h
··· 216 216 #define VID_CENTRE_CUT_PREF 0x05 /* PanScan with zero vector */ 217 217 218 218 /* MPEG video decoder commands */ 219 - #define VIDEO_CMD_STOP 0x000e 220 - #define VIDEO_CMD_PLAY 0x000d 221 - #define VIDEO_CMD_FREEZE 0x0102 222 - #define VIDEO_CMD_FFWD 0x0016 223 - #define VIDEO_CMD_SLOW 0x0022 219 + #define AV_VIDEO_CMD_STOP 0x000e 220 + #define AV_VIDEO_CMD_PLAY 0x000d 221 + #define AV_VIDEO_CMD_FREEZE 0x0102 222 + #define AV_VIDEO_CMD_FFWD 0x0016 223 + #define AV_VIDEO_CMD_SLOW 0x0022 224 224 225 225 /* MPEG audio decoder commands */ 226 226 #define AUDIO_CMD_MUTE 0x0001
+4 -1
include/linux/dvb/audio.h
··· 47 47 typedef enum { 48 48 AUDIO_STEREO, 49 49 AUDIO_MONO_LEFT, 50 - AUDIO_MONO_RIGHT 50 + AUDIO_MONO_RIGHT, 51 + AUDIO_MONO, 52 + AUDIO_STEREO_SWAPPED 51 53 } audio_channel_select_t; 52 54 53 55 ··· 135 133 * extracted by the PES parser. 136 134 */ 137 135 #define AUDIO_GET_PTS _IOR('o', 19, __u64) 136 + #define AUDIO_BILINGUAL_CHANNEL_SELECT _IO('o', 20) 138 137 139 138 #endif /* _DVBAUDIO_H_ */
+1 -1
include/linux/dvb/version.h
··· 24 24 #define _DVBVERSION_H_ 25 25 26 26 #define DVB_API_VERSION 3 27 - #define DVB_API_VERSION_MINOR 1 27 + #define DVB_API_VERSION_MINOR 2 28 28 29 29 #endif /*_DVBVERSION_H_*/
+49
include/linux/dvb/video.h
··· 80 80 } video_play_state_t; 81 81 82 82 83 + /* Decoder commands */ 84 + #define VIDEO_CMD_PLAY (0) 85 + #define VIDEO_CMD_STOP (1) 86 + #define VIDEO_CMD_FREEZE (2) 87 + #define VIDEO_CMD_CONTINUE (3) 88 + 89 + /* Flags for VIDEO_CMD_FREEZE */ 90 + #define VIDEO_CMD_FREEZE_TO_BLACK (1 << 0) 91 + 92 + /* Flags for VIDEO_CMD_STOP */ 93 + #define VIDEO_CMD_STOP_TO_BLACK (1 << 0) 94 + #define VIDEO_CMD_STOP_IMMEDIATELY (1 << 1) 95 + 96 + /* Play input formats: */ 97 + /* The decoder has no special format requirements */ 98 + #define VIDEO_PLAY_FMT_NONE (0) 99 + /* The decoder requires full GOPs */ 100 + #define VIDEO_PLAY_FMT_GOP (1) 101 + 102 + /* The structure must be zeroed before use by the application 103 + This ensures it can be extended safely in the future. */ 104 + struct video_command { 105 + __u32 cmd; 106 + __u32 flags; 107 + union { 108 + struct { 109 + __u64 pts; 110 + } stop; 111 + 112 + struct { 113 + __u32 speed; 114 + __u32 format; 115 + } play; 116 + 117 + struct { 118 + __u32 data[16]; 119 + } raw; 120 + }; 121 + }; 122 + 123 + 83 124 struct video_event { 84 125 int32_t type; 85 126 #define VIDEO_EVENT_SIZE_CHANGED 1 86 127 #define VIDEO_EVENT_FRAME_RATE_CHANGED 2 128 + #define VIDEO_EVENT_DECODER_STOPPED 3 129 + #define VIDEO_EVENT_VSYNC 4 87 130 time_t timestamp; 88 131 union { 89 132 video_size_t size; ··· 255 212 * extracted by the PES parser. 256 213 */ 257 214 #define VIDEO_GET_PTS _IOR('o', 57, __u64) 215 + 216 + /* Read the number of displayed frames since the decoder was started */ 217 + #define VIDEO_GET_FRAME_COUNT _IOR('o', 58, __u64) 218 + 219 + #define VIDEO_COMMAND _IOWR('o', 59, struct video_command) 220 + #define VIDEO_TRY_COMMAND _IOWR('o', 60, struct video_command) 258 221 259 222 #endif /*_DVBVIDEO_H_*/