Browse Source

V4L/DVB (11171): pvrusb2: Tie in sub-device decoder start/stop

Implement code to send appropriate streaming start/stop commands to
attached sub-devices

Signed-off-by: Mike Isely <isely@pobox.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Mike Isely 16 years ago
parent
commit
af78e16b5d
1 changed files with 39 additions and 26 deletions
  1. 39 26
      drivers/media/video/pvrusb2/pvrusb2-hdw.c

+ 39 - 26
drivers/media/video/pvrusb2/pvrusb2-hdw.c

@@ -1655,19 +1655,29 @@ static const char *pvr2_get_state_name(unsigned int st)
 
 static int pvr2_decoder_enable(struct pvr2_hdw *hdw,int enablefl)
 {
-	if (!hdw->decoder_ctrl) {
-		if (!hdw->flag_decoder_missed) {
-			pvr2_trace(PVR2_TRACE_ERROR_LEGS,
-				   "WARNING: No decoder present");
-			hdw->flag_decoder_missed = !0;
-			trace_stbit("flag_decoder_missed",
-				    hdw->flag_decoder_missed);
-		}
-		return -EIO;
+	if (hdw->decoder_ctrl) {
+		hdw->decoder_ctrl->enable(hdw->decoder_ctrl->ctxt, enablefl);
+		return 0;
 	}
-	hdw->decoder_ctrl->enable(hdw->decoder_ctrl->ctxt,enablefl);
-	// ?????
-	return 0;
+	/* Even though we really only care about the video decoder chip at
+	   this point, we'll broadcast stream on/off to all sub-devices
+	   anyway, just in case somebody else wants to hear the
+	   command... */
+	v4l2_device_call_all(&hdw->v4l2_dev, 0, video, s_stream, enablefl);
+	if (hdw->decoder_client_id) {
+		/* We get here if the encoder has been noticed.  Otherwise
+		   we'll issue a warning to the user (which should
+		   normally never happen). */
+		return 0;
+	}
+	if (!hdw->flag_decoder_missed) {
+		pvr2_trace(PVR2_TRACE_ERROR_LEGS,
+			   "WARNING: No decoder present");
+		hdw->flag_decoder_missed = !0;
+		trace_stbit("flag_decoder_missed",
+			    hdw->flag_decoder_missed);
+	}
+	return -EIO;
 }
 
 
@@ -4009,23 +4019,26 @@ int pvr2_hdw_cmd_powerdown(struct pvr2_hdw *hdw)
 
 int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
 {
-	if (!hdw->decoder_ctrl) {
-		pvr2_trace(PVR2_TRACE_INIT,
-			   "Unable to reset decoder: nothing attached");
-		return -ENOTTY;
+	pvr2_trace(PVR2_TRACE_INIT,
+		   "Requesting decoder reset");
+	if (hdw->decoder_ctrl) {
+		if (!hdw->decoder_ctrl->force_reset) {
+			pvr2_trace(PVR2_TRACE_INIT,
+				   "Unable to reset decoder: not implemented");
+			return -ENOTTY;
+		}
+		hdw->decoder_ctrl->force_reset(hdw->decoder_ctrl->ctxt);
+		return 0;
+	} else {
 	}
-
-	if (!hdw->decoder_ctrl->force_reset) {
-		pvr2_trace(PVR2_TRACE_INIT,
-			   "Unable to reset decoder: not implemented");
-		return -ENOTTY;
+	if (hdw->decoder_client_id) {
+		v4l2_device_call_all(&hdw->v4l2_dev, hdw->decoder_client_id,
+				     core, reset, 0);
+		return 0;
 	}
-
 	pvr2_trace(PVR2_TRACE_INIT,
-		   "Requesting decoder reset");
-	hdw->decoder_ctrl->force_reset(hdw->decoder_ctrl->ctxt);
-	// ?????
-	return 0;
+		   "Unable to reset decoder: nothing attached");
+	return -ENOTTY;
 }